使用JavaScript舍入小数

6
今日免费次数已满, 请开通会员/明日再来
16.181 to 16.18
16.184 to 16.18
16.185 to 16.19
16.187 to 16.19

我找到了一些答案,但是大多数都没有将16.185四舍五入至16.19。


@mplungjan,我不是在问“Math.round(0)和toFixed(0)”之间的区别。如果您仔细阅读我的问题,您会理解我在将16.185四舍五入到16.19时遇到的问题。 - Prasad
我很惊讶地发现 JavaScript 在 FF/Chrome 中显示 16.185 * 100 = 1618.4999999999998,而在 IE 中却是 1618.5。非常奇怪。 - Salman A
你是正确的。我的错误 - 但一定是某个东西的副本 ;) - mplungjan
@ mplungjan,你指出的帖子需要从1.5555到1.55,但我需要的输出是从1.5555到1.56。无论如何,@ayk已经回答了。 - Prasad
是的。这一个更好:https://dev59.com/zHVC5IYBdhLWcg3w51ny - mplungjan
8个回答

14
(Math.round((16.185*Math.pow(10,2)).toFixed(1))/Math.pow(10,2)).toFixed(2);

如果你的值是16.199,正常的四舍五入会返回16.2...但是使用这个方法,你将得到最后一个0,这样你就可以看到16.20!但请记住,该值将作为字符串返回。如果你想对它进行进一步操作,你必须将其解析为浮点数 :)

现在作为函数:

function trueRound(value, digits){
    return (Math.round((value*Math.pow(10,digits)).toFixed(digits-1))/Math.pow(10,digits)).toFixed(digits);
}

这很有用。如果你将它改成函数的形式,对于那些遇到和我一样问题的人来说也会很有用。function formatNumber(myNum, numOfDec) { return (Math.round((myNum * Math.pow(10, numOfDec)).toFixed(1)) / Math.pow(10, numOfDec)).toFixed(numOfDec); } - Prasad
这很好,但仍然不够精确,“roundTo(89.68449,2)”应该是“89.69”,但实际上是“89.68”。 - mrts

3
感谢@ayk的回答,我将您的函数修改为以下内容:
function trueRound(value, digits){
    return ((Math.round((value*Math.pow(10,digits)).toFixed(digits-1))/Math.pow(10,digits)).toFixed(digits)) * 1;
}

只需添加“*1”,因为您所写的,16.2会变成16.20,我不需要后面的零。

1

使用-

Decimal ds=new Decimal(##.##);
String value=ds.format(inputnumber);

这对我的情况非常完美,希望它能百分之百地工作。


1

您可以尝试一个更简单的函数...

function roundOffTo(number, place) {
    return Math.round(number * place) / place;
}

它是如何工作的? 位置可以是10、100、1000、10000等。反过来是0.1、0.01、0.001等。假设你的数字是16.185,而你的位置是100。它要做的第一件事是将数字乘以位置,即1618.5。通过Math.round四舍五入会得到1619。除以位置得到16.19。就这样。 顺便说一句,今天不必担心0.5问题,这个问题已经解决了。但以防万一,如果有问题,请将 Math.round(number * place) 更改为 Math.round(number * place + 0.1)。

0

[编辑] 这段代码对于像18.185这样的值不起作用,因为18.185 * Math.pow(10,2)被计算为1818.4999999999997。

Math.round(<value> * Math.pow(10,<no_of_decimal_places>)) / Math.pow(10,<no_of_decimal_places>) ;

例子: 1234.5678 --> 保留2位小数 --> 1234.57

Math.round(1234.5678 * Math.pow(10,2)) / Math.pow(10,2) ; 

我写成了10^<no_of_decimal_places>而不是Math.pow(10,<no_of_decimal_places>) --> 我已经修复了 - das_weezul
这个也不起作用。它将16.185四舍五入为16.18。我需要将其四舍五入为16.19。 - Prasad
这是正确的解决方案,但令人惊讶的是,FF和Chrome似乎存在奇怪的四舍五入问题。 - Salman A
问题在于将值乘以10^2后进行四舍五入的结果会导致.5的值变为.4999999999998,从而被向下舍入... - ayk
@Salman,我已经在IE、Firefox和Chrome中尝试过了,四舍五入后都返回16.18。 - Prasad
是的,这也让我感到困惑。即使是一个简单的测试,比如 Math.round(16.185*100) + ' ' + Math.round(1618.5)... 返回的结果是 1618 1619... 完全不一致。 - Salman A

0
function formatNumber(myNum, numOfDec) {
        var dec = Math.pow(10, numOfDec);
        return Math.round(myNum * dec + 0.1) / dec;
}

1
这个不起作用。它将16.185四舍五入为16.18。我需要将其舍入为16.19。 - Prasad
嗯,我明白了,这就是问题所在。 - Dmitry Evseev
你知道吗,你可以这样做,在你的值上增加额外的0.1,以防止值为5的情况:return Math.round(myNum * dec + 0.1) / dec; - Dmitry Evseev

0
你正在使用的四舍五入代码是正确的。但为了获得所需的结果,请从代码中删除 .toFixed(numOfDec)。
函数:
function formatNumber(myNum,numOfDec){
    var decimal = 1
    for (i = 1; i <= numOfDec; i++)
        decimal = decimal * 10 //The value of decimal determines the number of decimals to be rounded off with (.5) up rule 
    var myFormattedNum = Math.round(myNum * decimal) / decimal
    return (myFormattedNum)
}

希望它能在某种程度上对你有所帮助 :)


我已经尝试过了,但仍然遇到了同样的问题。它没有将16.185四舍五入为16.19。 - Prasad
@ Prasad,请试用我的解决方案,它能够得到你所需的结果! - ayk

0
parseFloat(myNum.toFixed(numOfDec))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接