Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.Net与单数乘法_.net_Vb.net_Multiplication - Fatal编程技术网

.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!!