我在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
我怎能避免这种情况?
答案 0 :(得分:0)
一切都很好!
不可预测,输入十进制是近似(IEEE 754: 128bit)
解决这个问题的一种方法是使用BigNum类。问题是,.net没有1.它确实有BigInteger(System.Numerics),但它没有BigDecimal。如果你想要1,那么通常你会使用GNU GMP,但我不认为存在C#版本。
但是只需付出努力就可以找到GMP c# wrapper in beta。