模拟Excel数字精度c# . net

本文关键字:net 精度 数字 Excel 模拟 | 更新日期: 2023-09-27 18:12:57

Excel Precision system

Excel有IEEE 754数字精度规范的修改版本。关于Excel如何计算的更多信息可以在这里找到。

总结:

  • 数字只存储15个前导数字。
  • 在任何计算之前,Excel尝试将数字表示为2的幂(因为它是二进制表示)
  • 如果数字不是2的简单幂,它使用几何级数来找到最接近二进制表示的数字。
  • 如果数字很小,Excel将其表示为2的简单幂。

<标题>

其他语言,在我的例子中 c# . net ,以不同的方式实现数字精度。因此,当您尝试模拟电子表格时,您最终会得到一些精度不匹配。

打开Excel并在任意单元格中插入此公式:

=1+1/9000-1.

然后你会注意到结果与用下面的公式得到的结果是不一样的:

=1/9000

我不想改变Excel的这种行为,我只是想模仿它

现在在c#中创建一个简单的程序,用Decimal数做同样的计算。我用十进制来表示数字。但是它可以是Float的两倍,结果是一样的

decimal result = 1.0M + 1.0M / 9000.0M - 1.0M;
Console.WriteLine(result.ToString("N30"));

c#是否可以模拟Excel的数字精度?这样我就可以得到与Excel相同的结果?

<标题>编辑

正如@DStanley提到的,使用double解决了上面的例子,但它仍然不适用于其他情况,例如:

Excel:

=1+0.000000000000001665280326829110-1
0.000000000000000000000000000000
c#:

double result = 1.0 + 0.000000000000001665280326829110 - 1.0;
Console.WriteLine(result.ToString("N30"));
0.000000000000001554312234475220

模拟Excel数字精度c# . net

如果你想模拟浮点数学,那么使用double而不是decimaldecimal旨在以牺牲速度为代价提供更精确的以10为基数的表示。如果你在c#中使用double,你会得到与Excel相同的结果(至少对于你的例子-可能有其他边缘情况表现不同):

c#:

double result = 1.0 + 1.0 / 9000.0 - 1.0;
Console.WriteLine(result.ToString("N30"));
0.000111111111111173000000000000
Excel:

=1+1/9000-1
0.000111111111111173000000000000