【问题标题】:Javascript: how to round number to 2 non-zero decimalsJavascript:如何将数字四舍五入为 2 个非零小数
【发布时间】:2016-08-08 20:03:50
【问题描述】:

如果没有 jQuery,我如何将浮点数四舍五入为 2 个非零小数(但仅在需要时 - 1.5 而不是 1.50)?

就像这样:

2.50000000004 -> 2.5
2.652 -> 2.65
2.655 -> 2.66
0.00000204 -> 0.000002
0.00000205 -> 0.0000021

我试过这段代码:

var r = n.toFixed(1-Math.floor(Math.log10(n)));

n=0.00000205 隐含r=0.0000020,与上述条件相冲突。 但是n=0.0000020501隐含r=0.0000021,可以,所以错误只针对最后一个小数点5,应该四舍五入。

【问题讨论】:

  • @PrasadShinde 这会将最后 2 个示例四舍五入为 0,这不是 OP 想要的。
  • 不是重复的。我不想四舍五入到 2 个小数位,我想四舍五入到 2 个非零小数位。
  • 您要查找的术语是“四舍五入”。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 获得0.000020 的原因与浮点表示的不精确性有关。 0.0000205 不能完全表示为浮点值。对于可以的数字,结果如您所料。注意:尝试这样做的 Ad-hoc 编码函数可能都会遇到同样的问题。

标签: javascript math rounding


【解决方案1】:

这应该做你想做的:

function twoDecimals(n) {
  var log10 = n ? Math.floor(Math.log10(n)) : 0,
      div = log10 < 0 ? Math.pow(10, 1 - log10) : 100;

  return Math.round(n * div) / div;
}

var test = [
  2.50000000004,
  2.652,
  2.655,
  0.00000204,
  0.00000205,
  0.00000605
];

test.forEach(function(n) {
  console.log(n, '->', twoDecimals(n));
});

【讨论】:

  • n = 0.00000305 正确舍入为0.0000031,但n = 0.00000605 舍入为0.000006,而不是0.0000061
  • 是的,好一点。不知道为什么,但仍有一些值未正确舍入,例如 0.000001050.00000805
  • 唉,这些是IEEE 754 编码不可避免地逼近的结果。 console.log(0.00000105 * 1E7) -&gt; 10.499999999999998
  • 是的,我可以看到。 0.000008050000000000001 被正确舍入......几个非常特殊的值无关紧要。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2022-12-03
  • 2013-12-20
  • 2022-01-23
相关资源
最近更新 更多