.Net与单数乘法
有人能解释这种奇怪的现象吗:.Net与单数乘法,.net,vb.net,multiplication,.net,Vb.net,Multiplication,有人能解释这种奇怪的现象吗: Dim result as single = 0 result = CType("8.01", Single) * 100 ' result=801.0 as expected result = CType("8.02", Single) * 100 ' result=802.000061 --- not expected 除此之外 result = 8.02 * 100 ' result = 802.0 as expected Single(或float)只有
Dim result as single = 0
result = CType("8.01", Single) * 100 ' result=801.0 as expected
result = CType("8.02", Single) * 100 ' result=802.000061 --- not expected
除此之外
result = 8.02 * 100 ' result = 802.0 as expected
Single
(或float
)只有七个有效数字,因此可能超出这些数字的所有内容都是非常虚假的。这是浮点运算的正常产物。您的数字最多只能依赖小数点后的4位数字(因为小数点前已经有三位有效数字)
进一步阐述,数字8.01和8.02不能用二进制存储精确表示(因为0.01和0.02都不能用1/2n形式的分数和精确表示)。详细信息可能因数字而异,但在使用此类数字时,您可能会看到超出正常精度范围的多余数字
这并不影响801和802可以精确表示的事实,但在这种情况下,您没有确切的数字可以开始
ETA:事实上,当您直接包含计算时,您看到的只是:编译器将为您评估计算结果,并将802
写入程序。您可以使用Reflector来验证这一点。此外,默认情况下,源代码中的浮点文字可能是双精度的
,因此您可以从这里开始使用更高的精度。如果结果
是一个单数
,这将被降级为单数
,小数点后第16位的错误将被简单地丢弃,因为它无论如何都不能放入单数
。单数
(或浮点
)只有七个有效数字,因此,除此之外,所有可能印刷的东西几乎都是假的。这是浮点运算的正常产物。您的数字最多只能依赖小数点后的4位数字(因为小数点前已经有三位有效数字)
进一步阐述,数字8.01和8.02不能用二进制存储精确表示(因为0.01和0.02都不能用1/2n形式的分数和精确表示)。详细信息可能因数字而异,但在使用此类数字时,您可能会看到超出正常精度范围的多余数字
这并不影响801和802可以精确表示的事实,但在这种情况下,您没有确切的数字可以开始
ETA:事实上,当您直接包含计算时,您看到的只是:编译器将为您评估计算结果,并将
802
写入程序。您可以使用Reflector来验证这一点。此外,默认情况下,源代码中的浮点文字可能是双精度的
,因此您可以从这里开始使用更高的精度。如果结果
是一个单个
,这将被降级为单个
,小数点后第16位的错误将被简单地丢弃,因为它无论如何都不能放入单个
。这是由于内存中浮点数表示方式的限制。请通读全文-这不是错误,也不是特定于.net的内容
编辑:这两篇文章也值得一看(后者数学性很强)
- 这是由于在内存中表示浮点数的方式受到限制。请通读全文-这不是错误,也不是特定于.net的内容
编辑:这两篇文章也值得一看(后者数学性很强)
在.NET中,单
和双表示为浮点数,不幸的是,存储这些类型的数字并不精确。当使用“单”和“双”数字时,您会遇到小的差异
然而,还有一种选择-.NET有一个
Decimal
类型,该类型在处理这些数字时会更好。它仍然不是完美的(尤其是最后一段),但在表示货币等数量方面会更好。Single
和Double
在.NET中表示为浮点数,不幸的是,存储这类数字并不精确。当使用“单”和“双”数字时,您会遇到小的差异
然而,还有一种选择-.NET有一个
Decimal
类型,该类型在处理这些数字时会更好。它仍然不完美(特别是见最后一段),但在表示货币等数量方面会更好。谢谢Johannes,在我修改帖子添加更多部分之前,你应该已经回复了我的答案。你说的很有道理。谢谢Johannes,在我修改帖子添加更多部分之前,你应该已经回复了我的答案。你说的有道理。检查8.11。它给出的值为810.99999!!检查8.11。它给出的值为810.99999!!