代码之家  ›  专栏  ›  技术社区  ›  Andrew

.Net与单数乘法

  •  0
  • Andrew  · 技术社区  · 15 年前

    有人能解释这种奇怪的现象吗:

    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
    
    4 回复  |  直到 15 年前
        1
  •  2
  •   Joey    15 年前

    Single (或 float )只有七个有效数字,所以可能超出这些数字的所有内容都是伪造的。这是浮点运算的正常产物。您的数字最多只能依赖小数点后的4位数字(因为小数点前已经有三位有效数字)。

    进一步阐述,数字8.01和8.02不能用二进制存储精确表示(因为0.01和0.02都不能用1/2形式的分数和精确表示) N 使用此类数字时,请参阅超出正常精度范围的外来数字。

    在这种情况下,可以精确地表示,但没有确切的数字开始。

    事实上,当您直接包含计算时,您看到的只是:编译器将为您评估计算并简单地编写 802 进入程序。您可以使用Reflector来验证这一点。源代码中的浮点文字也可能 Double result 单身 这将被降级为 单身 单身

        2
  •  1
  •   rob    15 年前
        3
  •  0
  •   Community Mohan Dere    7 年前

    如果需要比较浮点值,请参见此处: Comparing floating point values

        4
  •  0
  •   Richard Downer    15 年前

    Single Double

    Decimal 输入更擅长处理这些数字的类型。它仍然不完美(参见 http://www.yoda.arachsys.com/csharp/decimal.html