【发布时间】:2015-01-08 14:30:00
【问题描述】:
我在 C#.NET 中遇到不可预测的小数行为。这是代码sn-p
decimal num1 = 2474M;
decimal num2 = 4947M;
decimal num3 = 4947M;
decimal sum = num1 + num2 + num3;
decimal perDouble1 = num1 / sum ;
decimal perDouble2 = num2 / sum ;
decimal perDouble3 = num3 / sum ;
decimal sumDouble = perDouble1 + perDouble2 + perDouble3;
输出:1.0000000000000000000000000001M
如果我将数字更改为
decimal num1 = 2474M;
decimal num2 = 4946M;
decimal num3 = 4947M;
输出为:1.0000000000000000000000000000M
我怎样才能避免这种情况?
【问题讨论】:
-
你的问题到底是什么?
-
来自MSDN的注释:
The Decimal type does not eliminate the need for rounding. Rather, it minimizes errors due to rounding. -
至于如何避免,四舍五入。您可能不需要小数点后 28 位的精度,因此将其四舍五入到合理的位置。
-
使用某种由两个
BigIntegers 组成的 Rational 或 Fraction 类型。