不可预测的十进制求和 C#
本文关键字:求和 十进制 不可预测 | 更新日期: 2023-09-27 18:36:57
我在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.000000000000000000000000000000001M如果我将数字更改为
decimal num1 = 2474M;
decimal num2 = 4946M;
decimal num3 = 4947M;
输出为:1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 我怎样才能避免这种情况?
一切都很好!
它不是不可预测的,十进制类型是一个近似值(IEEE 754:128位)
解决此问题的一种方法是使用 BigNum 类。 问题是,.net 没有 1。它确实有BigInteger(System.Numerics),但没有BigDecimal。如果你想要1,那么通常你会使用GNU GMP,但我认为不存在C#版本。
但是,只需 0 努力,您就可以在测试版中找到 GMP c# 包装器。