簡體   English   中英

模擬Excel數值精度C#.NET

[英]Emulate Excel Numeric Precision C# .NET

Excel Precision系統

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相同(至少對於示例來說,可能還會有其他邊緣情況的行為有所不同):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM