gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:15:24 24 4
gpt4 key购买 nike

当我在 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,999999999999999999999999999 而 calc.exe 说 1

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

(677605234775492641 / 116759166847407000) + (932737194383944703 / 2451942503795547000)

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

最佳答案

如所述here , calc 使用任意精度引擎进行计算,而 double 是标准的 IEEE-754 算法,decimal 也是浮点算法,只是十进制,正如你所指出的,它有同样的问题,只是在另一个基数上。

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

另一点是,当您将结果四舍五入到一定位数(少于 15 位)时,在很多情况下您也会得到直观上“正确”的结果。 C# 已经进行了一些舍入以向您隐藏 double 的确切值(其中 0.3 绝对不完全是 0.3,但可能类似于 0.30000000000000004)。通过减少显示的位数,您可以减少与正确值之间如此微小差异的发生。

关于c# - C# 中的计算与 Windows 计算器一样准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39390410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com