1

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

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

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))

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

4

2 回答 2

4

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

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

关于该主题的一个很好的答案在这里:Difference between decimal, float and double in .NET?

于 2013-10-18T04:09:49.863 回答
1

十进制数据类型的精度为 28-29 位有效数字。因此,您必须了解的是,当您考虑 28-29 位有效数字时,您仍然不准确。

因此,当您计算 (1/37) 的十进制值时,您必须注意的是,在此阶段您只能获得 28-29 位的精度。例如,当您采用 2 位有效数字时,1/37 为 0.02,当您采用 3 位有效数字时为 0.027。想象一下,在每种情况下,您将 1 与这些值相除。在第一种情况下你得到 50,在第二种情况下你得到 37.02...考虑到 28-29 位(十进制),你的准确度为 37.000000000000000000000000037。如果你必须得到一个精确的 37,你只需要比十进制提供的多 28-29 个有效数字。

始终使用最大有效数字进行计算,并仅使用 Math.Round 对您的答案进行四舍五入以获得所需的结果。

于 2013-10-18T04:19:04.783 回答