System.Decimal轮次分配

时间:2010-04-09 10:25:46

标签: .net clr decimal rounding

任何人都可以解释为什么我会得到以下结果?

Dim badDecimal As Decimal = 54.50327999999999 
Dim expectedDecimal As Decimal = CDec("54.50327999999999")

badDecimal = 54.50328D,而expectedDecimal = 54.50327999999999D。我的理解是badDecimal应该包含expectedDecimal的值(expectedDecimal可以保存正确值的事实表明Decimal类型具有保存值的精度)。

提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:6)

根据此页面:Decimal Data Type (Visual Basic),您需要使用大写字符D后缀十进制文字值,否则编译器将尝试将其编译为适当但不同的数字类型,如IntegerLongDouble等,具体取决于所使用的常量值。

在您的情况下,代码基本上与编译器类似:

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