(10 * 1.11 = 11.1)评估为FALSE。如何纠正?

6di*_*go9 1 excel vba

a = 10
b = 1.11
c = 11.1
' (mathematically: 10*1.11=11.1)
debug.print a*b = c
Run Code Online (Sandbox Code Playgroud)

我得到的是False(不正确),而不是True(正确)。
我知道这种错误是由于二进制计数方式而发生的,因此我必须忍受它。

问题是:使其正常工作的最佳方法是什么?
将数字与小数进行比较时,以下是否是我们应该使用的最佳解决方案?可靠吗?

round(a*b,2) = round(c,2) 
Run Code Online (Sandbox Code Playgroud)

Vit*_*ata 5

.1涉及到浮点运算时,几乎永远不会正确。原因是.1无法将表示为的1/2^n16位数字之内n

这些是一些数字,使用浮点数不会出现问题,因为它们可以表示为1/2^n

  • 0.128 = 1/2 ^ 5
  • 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
Run Code Online (Sandbox Code Playgroud)

  • @ 6diegodiego9重读。单击十进制时看到的文档显示了存储的三个不同信息位。12个字节仅指数据的无符号整数部分。 (4认同)
  • 好东西。我不知道为什么MS在这里没有提到它https://docs.microsoft.com/en-gb/office/troubleshoot/excel/floating-point-arithmetic-inaccurate-result (2认同)
  • @SJR-我不知道。尽管如此,他们的C#的[浮点数字类型文档](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/floating-point-numeric-types)相当好。 (2认同)
  • 谢谢@Vityata!非常有用的答案。根据此页面https://docs.microsoft.com/zh-CN/office/vba/language/reference/user-interface-help/data-type-summary,十进制数为14个字节,但如果您单击“ “十进制”,它说它是12个字节大。真相是什么 (2认同)