【问题标题】:Using toFixed(2) and math round to get correct rounding使用 toFixed(2) 和数学舍入来获得正确的舍入
【发布时间】:2010-05-18 20:47:46
【问题描述】:

我想找到一个能返回这种格式化值的函数:

1.5555 => 1.55
1.5556 => 1.56
1.5554 => 1.55
1.5651 => 1.56

toFixed() 和数学回合返回这个值:

1.5651.fixedTo(2) => 1.57

这对于货币四舍五入很有用。

【问题讨论】:

  • 你有第四位小数影响第二位小数吗?你什么时候会用这个?
  • 你为什么要用这种奇怪的方式舍入?这对四舍五入有何用处?
  • 您的示例似乎并没有真正传达您的意思。你想强制执行的规则是什么,究竟是什么?向下舍入最后一个“5”位,除非下一个数字 > 5?
  • 确实,这是一种奇怪的舍入方式。对我来说真的没有任何意义。
  • Richar Pryor 在那部超人电影中赚到那么多钱不就是这样吗?

标签: javascript rounding


【解决方案1】:

这个怎么样?

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

【讨论】:

  • 抱歉,在格式化网站时出现复制和粘贴错误。哦,你很清楚为什么不应该使用这种舍入方法,对吧?
  • 它不适合我的消费;)但是asking 想将金额从 0.181 舍入到 0.18 和 0.185 到 0.19,我从来没有这么确定。在这些情况下,toFixed(2) 感觉不对。
【解决方案2】:

和标准函数

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

【讨论】:

【解决方案3】:

您可以使用本机 Number.toFixed() 方法。

parseFloat(10.159.toFixed(2))

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2017-06-10
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多