Excel (10*1.11=11.1)的计算结果为FALSE。如何纠正

Excel (10*1.11=11.1)的计算结果为FALSE。如何纠正,excel,vba,Excel,Vba,(10*1.11=11.1)的计算结果为FALSE a = 10 b = 1.11 c = 11.1 ' (mathematically: 10*1.11=11.1) debug.print a*b = c 我得到的是假(不正确)而不是真(正确)。 我知道这是因为二进制的计数方式,所以我不得不接受它 使其正常工作的最佳方法是什么? 将数字与小数进行比较时,以下是最佳解决方案吗?它可靠吗 round(a*b,2) = round(c,2) 当涉及到.1时,浮点算术几乎永远不会正确。原因是.1

(10*1.11=11.1)的计算结果为FALSE

a = 10
b = 1.11
c = 11.1
' (mathematically: 10*1.11=11.1)
debug.print a*b = c
我得到的是假(不正确)而不是真(正确)。
我知道这是因为二进制的计数方式,所以我不得不接受它

使其正常工作的最佳方法是什么?
将数字与小数进行比较时,以下是最佳解决方案吗?它可靠吗

round(a*b,2) = round(c,2) 

当涉及到
.1
时,浮点算术几乎永远不会正确。原因是
.1
不能表示为
1/2^n
n
的16位以内

这些数字在浮点运算中不会出现问题,因为它们可以表示为
1/2^n

  • 0.125=1/2^3
  • 0.5=1/2 ^1
  • 0.375=1/2^2+1/2^3
于是,问题就来了。这是最好的方法:

Sub TestMe()

    Dim a, b, c 'declaring as Variant, as Decimal cannot be declared in VBA

    a = CDec(10)
    b = CDec(1.11)
    c = CDec(11.1)
    Debug.Print a * b = c

End Sub

如果将a、b和c定义为
single
则计算结果为真?1.11+1.11+1.11+1.11+1.11=7.77 false,而Double也为假,
Debug.Print CDec(a*b)=CDec(c)
这种方法能解决所有这些舍入问题吗?很好。我想知道为什么MS在这里没有提到@SJR-我不知道。不过,他们对C#的评价还是很好的。谢谢@vityta!非常有用的答案。根据这个页面,一个十进制数是14字节大,但如果你点击“Decimal”,它说它是12字节大。真相是什么?@6diegodiego9再次阅读。单击Decimal时看到的文档显示了存储的三个不同的信息位。12字节仅指数据的无符号整数部分。