Javascript 如果结果小数后跟一系列9,则将输入四舍五入为整数值

Javascript 如果结果小数后跟一系列9,则将输入四舍五入为整数值,javascript,math,Javascript,Math,我有一个JavaScript计算器,它使用Math.cbrt()函数。当我计算125的立方根时,它返回4.99999999999。我知道我可以使用Math.round()将此函数返回的任何答案四舍五入为整数值,但我不想这样做。当且仅当计算结果是某个数字后跟小数点后的字符串9(或类似的数字,如4.9999998)时,有没有办法使用此方法?您要处理的是计算中浮点数字的挫折感。有关此关键主题的更多信息,请参阅 var threshold = 0.999; // set to whatever you

我有一个JavaScript计算器,它使用
Math.cbrt()
函数。当我计算125的立方根时,它返回4.99999999999。我知道我可以使用
Math.round()
将此函数返回的任何答案四舍五入为整数值,但我不想这样做。当且仅当计算结果是某个数字后跟小数点后的字符串9(或类似的数字,如4.9999998)时,有没有办法使用此方法?

您要处理的是计算中浮点数字的挫折感。有关此关键主题的更多信息,请参阅

var threshold = 0.999; // set to whatever you want
var fraction = result % 1;
if (fraction >= threshold) {
  result = Math.round(result);
}
短版本: 某些非整数值无法由计算机精确表示,因此它们存储的值“足够接近”。只要试着在你最喜欢的游戏中评估
3.3/3

说什么?! 计算机在数字/数学方面应该是完美的,对吗?我能相信他们给我的任何答案吗

是的,对于整数,它们非常完美。但对于非整数计算,您应该假设答案不准确,并考虑这些浮点错误

Javascript中的解决方案 在较新版本的Javascript中,定义了一个常量,它是实际数字与实际存储的近似值之间的最小差值

使用这个,你可以将这个常数乘以你得到的结果,然后把它加到结果中,你应该得到你需要的精确值

function cbrt(n) { 
    return Math.cbrt(n) + (Number.EPSILON * Math.cbrt(n)); 
}
或者,如果您只关心小数位数不超过某个小数位数(小于20)的数字,则可以将该方法对数字的舍入行为与
parseFloat()
函数一起使用


如果都是9的话,那就真的吗?关于
4.99999999 8
?@MikeC根据您的评论进行了编辑。您不想在四舍五入中使用同样的内容吗?请参阅相关内容。您可以通过直接检查mantisa二进制表示来检测溢出/下溢。。。并直接纠正它…@Thilo这只会向上取整为整数。如果它需要执行更多操作,那么OP需要指定。如何将Number.EPSILON与trig函数一起使用?我尝试添加它,但这只适用于某些参数。其他的则需要减去它才能得到准确的值。有没有办法检查结果是否刚好超过/低于准确值?@newbie2015我不确定,老实说,我仍在试图找出是否有一种解决JS中所有浮点不准确问题的银弹方法。也许它只适用于立方根,因为答案总是与输入相同的符号,而对于trig函数则不是这样。你试过使用
parseFloat(x.toFixed(n))
方法吗?我没有,没有。我对JavaScript不是最敏锐的,所以我不确定如何让它与trig函数这样的函数一起工作。我的计算器使用函数函数
tan(form){form.display.value=Math.tan(form.display.value);}
如果包含
parseFloat(x.toFixed(n))
bit?@newbie2015,我只需要在我的答案末尾创建一个类似
num
函数的全局辅助函数,然后您的函数就可以使用它:
函数tan(form){form.display.value=num(Math.tan(form.display.value));}
function num(n, prec) {
    if (prec === void 0) prec = 8; // default to 8 decimal places
    return parseFloat(n.toFixed(prec));
}