[英]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.