任何人都可以解释为什么我会得到以下结果?
Dim badDecimal As Decimal = 54.50327999999999
Dim expectedDecimal As Decimal = CDec("54.50327999999999")
badDecimal = 54.50328D,而expectedDecimal = 54.50327999999999D。我的理解是badDecimal应该包含expectedDecimal的值(expectedDecimal可以保存正确值的事实表明Decimal类型具有保存值的精度)。
提前感谢您提供的任何帮助。
答案 0 :(得分:6)
根据此页面:Decimal Data Type (Visual Basic),您需要使用大写字符D
后缀十进制文字值,否则编译器将尝试将其编译为适当但不同的数字类型,如Integer,Long,Double等,具体取决于所使用的常量值。
在您的情况下,代码基本上与编译器类似:
Dim badDecimal As Decimal = (constant of type System.Double)
因此,在编译时,常量值已经失去了精度。
只需将代码更改为:
Dim badDecimal As Decimal = 54.50327999999999D
^
+-- add this
它应该按预期工作。
然而,我会厌倦期望两个变量相同,有关{浮动点类型的问题'StackOverflow上有足够的问题,至少让我告诉你,你可能会有一些细微差别第N个小数,足够小到不能显示或调试器,但足以使两个变量比较不同。
因此,如果你想要比较它们,请记住这一点,典型的方法是从另一个值中减去一个值,取其绝对值,然后将其与一些微小的值进行比较,说“我接受一个不同的大,但是不大“。
即。像这样:
If Math.Abs(badDecimal - expectedDecimal) < 0.000001 Then
而不是:
If badDecimal = expectedDecimal Then