使用toFixed(2)和math round来获得正确的四舍五入

5
我希望找到一个函数,能够返回这种格式化的值:
1.5555 => 1.55
1.5556 => 1.56
1.5554 => 1.55
1.5651 => 1.56

toFixed() 和 Math.round() 方法都会返回以下值:

1.5651.fixedTo(2) => 1.57

这将对金额舍入非常有用。


1
第四位小数影响第二位小数吗?你什么时候会使用它? - Matti Virkkunen
5
为什么你想要用这种奇怪的方式四舍五入?这种方法在货币计算中有什么用处? - sth
1
你的例子似乎并没有很好地阐明你的观点。你到底想要执行什么规则?是在最后一位数字为“5”的情况下向下取整,除非下一位数字大于5吗? - Mark Bessey
确实,这是一种奇怪的四舍五入方式。对我来说没有任何意义。 - Sasha Chedygov
那不就是理查德·普莱尔在超人电影中赚了那么多钱的方式吗? - kennebec
@adrien334:感谢您完全忽略了我们所有的评论。 - Matti Virkkunen
3个回答

6
这个怎么样?
function wacky_round(number, places) {
    var multiplier = Math.pow(10, places+2); // get two extra digits
    var fixed = Math.floor(number*multiplier); // convert to integer
    fixed += 44; // round down on anything less than x.xxx56
    fixed = Math.floor(fixed/100); // chop off last 2 digits
    return fixed/Math.pow(10, places);
}

1.5554 => 1.55

1.5555 => 1.55

1.5556 => 1.56

1.5651 => 1.56

这样做可以实现四舍五入,但是这不是一种普遍被接受的舍入方式。 http://en.wikipedia.org/wiki/Rounding#Tie-breaking


抱歉,在为网站格式化时出现了复制粘贴错误。哦,你清楚为什么不应该使用这种舍入方法了吧? - Mark Bessey
这并不是我需要的内容 ;) 然而,那个提问者想要将.181四舍五入为.18,将.185四舍五入为.19,这让我感到很困惑。在这些情况下使用toFixed(2)感觉不太对。 - mplungjan

3

标准函数

fixedTo = function (number, n) {
  var k = Math.pow(10, n);
  return (Math.round(number * k) / k);
}

然后调用

fixedTo(1.5555, 2)  // 1.56
fixedTo(1.5555, 2)  // 1.556
fixedTo(0.615, 2)   // 0.62

这个解决方案对于 1.005 不起作用。我建议使用这个函数代替 - Hanna

0
您可以使用原生的Number.toFixed()方法。
parseFloat(10.159.toFixed(2))

以上返回10.16。Number.toFixed()返回一个字符串,所以我使用parseFloat将其转换为数字。

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