小数精度

Rog*_*Far 3 c# decimal

我使用小数类型进行高精度计算(货币)。

但我今天遇到了这个简单的划分:

1 / (1 / 37)这应该再次得到 37

http://www.wolframalpha.com/input/?i=1%2F+%281%2F37%29

但 C# 给了我: 37.000000000000000000000000037M

我尝试了这两个: 1m/(1m/37m);Decimal.Divide(1, Decimal.Divide(1, 37))

但两者产生相同的结果。这种行为如何解释?

Szy*_*mon 5

Decimal将值存储为精度有限的十进制浮点数。1 / 37 的结果未精确存储,因为它存储为 0.027027027027027027027027027M。真实数字的十进制表示形式为无限组 027。因此,您无法获得每个可能数字的十进制表示形式的精确数字。

如果您Double在相同的计算中使用,则在这种情况下最终结果是正确的(但这并不意味着它总是更好)。

关于这个主题的一个很好的答案是:Difference betweendecimal, float and double in .NET?