不可预测的十进制求和 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

我怎样才能避免这种情况?

不可预测的十进制求和 C#

一切都很好!

它不是不可预测的,十进制类型是一个近似值(IEEE 754:128位)

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

但是,只需 0 努力,您就可以在测试版中找到 GMP c# 包装器。