gpt4 book ai didi

Javascript 舍入失败

转载 作者:行者123 更新时间:2023-11-30 10:29:56 31 4
gpt4 key购买 nike

这是我们正在使用的舍入函数(取自关于如何舍入的 stackoverflow 答案)。它四舍五入到 2dp(默认)

例如2.185应该去2.19

function myRound(num, places) {
if (places== undefined) {
// default to 2dp
return Math.round(num* 100) / 100;
}
var mult = Math.pow(10,places);

return Math.round(num* mult) / mult;
}

它运行良好,但现在我们发现了一些错误(在 chrome 和在 IIS 7.5 上作为 jscript classic asp 运行)。

例如:

alert(myRound(2.185));      // = 2.19
alert (myRound(122.185)); // = 122.19
alert (myRound(511.185)); // = 511.19
alert (myRound(522.185)); // = 522.18 FAIL!!!!
alert (myRound(625.185)); // = 625.18 FAIL!!!!

有没有人知道:

  1. 为什么会这样。
  2. 我们如何在没有像这样的随机舍入错误的情况下将一半舍入到 2 dp。

update: OK,问题的症结在于js中,625.185 * 100 = 62518.499999我们怎样才能克服这个问题?

最佳答案

您的问题不容易解决。发生这种情况是因为 IEEE double 使用无法精确表示所有小数的二进制表示。最接近 625.185 的内部表示是 625.18499999999994543031789362430572509765625,它略小于 625.185,正确的舍入是向下的。


根据您的情况,您可能会遇到以下情况:

Math.round(Math.round(625.185 * 1000) / 10) / 100    // evaluates to 625.19

然而,这并不完全正确,因为,例如,它会将 625.1847 向上舍入为 625.19。仅当您知道输入的小数位永远不会超过三位时才使用它。


一个更简单的选择是在舍入之前添加一个小的 epsilon:

Math.round(625.185 * 100 + 1e-6) / 100

这仍然是一个折衷方案,因为您可能会得到一个略小于 625.185 的数字,但它可能比第一个解决方案更可靠。不过要注意负数。

关于Javascript 舍入失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17443628/

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