繁体   English   中英

C#中的计算与Windows计算器一样准确

[英]Computations in C# as accurately as with Windows Calculator

当我在C# 100.0 * 1.005执行以下双倍乘法时,结果得到100,49999999999999 我相信这是因为无法表示确切的数字(或者在评估表达式时的某些媒体间结果)。 当我在calc.exe中进行相同的计算时,我按预期得到100.5

另一个例子是0.001的九倍增量(这是第一次出现偏差)所以基本上9d * 0.001d = 0,0090000000000000011 当我在calc.exe中进行相同的计算时,我得到了预期的0.009

现在我可以争辩说,我应该选择小数。 但是使用十进制我得到其他计算的问题,例如((1M / 3M) * 3M) = 0,9999999999999999999999999999而calc.exe说1

使用calc.exe,我可以将1乘3次除以一些真正的小数,然后再乘以3再多次,然后达到精确1 因此我怀疑,calc.exe在内部用分数计算,但显然是真正的大分数,因为它计算

(677605234775492641 / 116759166847407000) + (932737194383944703 / 2451942503795547000)

在进行长计算时,公共分母是-3422539506717149376(发生溢出),所以它必须至少是ulong。 有人知道如何实现calc.exe中的计算吗? 这个实现是否公开用于重用?

如上所述这里calc使用其计算的任意精度的发动机,而double是标准的IEEE-754算法,而decimal也浮点运算,只是小数,正如你所指出的,有同样的问题,只是在另一个基地。

您可以尝试为C#找到这样一个任意精度的算术库并使用它,例如这个 (不知道它是否好;是第一个结果)。 内部calc的一个不可用作API,因此您无法使用它。

另一点是,当你将结果四舍五入到一定数量的位置(小于15)时,在很多情况下你也会获得直观“正确”的结果。 C#已经做了一些舍入来隐藏你的double精确值(其中0.3绝对不是0.3 ,但可能是0.30000000000000004 )。 通过减少显示的位数,可以减少与正确值之间存在的这种非常小的差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM