模拟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
标题>
标题>
如果你想模拟浮点数学,那么使用double
而不是decimal
。decimal
旨在以牺牲速度为代价提供更精确的以10为基数的表示。如果你在c#中使用double
,你会得到与Excel相同的结果(至少对于你的例子-可能有其他边缘情况表现不同):
double result = 1.0 + 1.0 / 9000.0 - 1.0;
Console.WriteLine(result.ToString("N30"));
0.000111111111111173000000000000
Excel: =1+1/9000-1
0.000111111111111173000000000000