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

Dav*_*vid 2 c#

当我在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)
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*oey 10

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

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

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