不可预测的小数求和C#

时间:2015-01-08 14:30:01

标签: c# .net decimal

我在C#.NET中遇到了不可预测的十进制行为。这是代码段

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

我怎能避免这种情况?

1 个答案:

答案 0 :(得分:0)

一切都很好!

不可预测,输入十进制近似IEEE 754: 128bit

解决这个问题的一种方法是使用BigNum类。问题是,.net没有1.它确实有BigInteger(System.Numerics),但它没有BigDecimal。如果你想要1,那么通常你会使用GNU GMP,但我不认为存在C#版本。

但是只需付出努力就可以找到GMP c# wrapper in beta