你如何在Javascript中四舍五入到小数点后一位?

IT技术 javascript rounding
2021-01-24 02:19:03

您可以将 javascript 中的数字四舍五入到小数点后的 1 个字符(正确四舍五入)吗?

我尝试了 *10, round, /10 但它在 int 的末尾留下了两位小数。

6个回答

Math.round(num * 10) / 10 有效,这是一个例子......

var number = 12.3456789
var rounded = Math.round(number * 10) / 10
// rounded is 12.3

如果您希望它有一位小数,即使那是 0,也请添加...

var fixed = rounded.toFixed(1)
// fixed is always to 1 d.p.
// NOTE: .toFixed() returns a string!

// To convert back to number format
parseFloat(number.toFixed(2))
// 12.34
// but that will not retain any trailing zeros

// So, just make sure it is the last step before output,
// and use a number format during calculations!

编辑:添加具有精度功能的圆形...

使用这个原理,作为参考,这里有一个方便的小圆函数,它需要精确......

function round(value, precision) {
    var multiplier = Math.pow(10, precision || 0);
    return Math.round(value * multiplier) / multiplier;
}

... 用法 ...

round(12345.6789, 2) // 12345.68
round(12345.6789, 1) // 12345.7

... 默认四舍五入到最接近的整数(精度 0) ...

round(12345.6789) // 12346

...并可用于四舍五入到最接近的 10 或 100 等...

round(12345.6789, -1) // 12350
round(12345.6789, -2) // 12300

... 以及正确处理负数 ...

round(-123.45, 1) // -123.4
round(123.45, 1) // 123.5

...并且可以与 toFixed 结合使用以一致地格式化为字符串 ...

round(456.7, 2).toFixed(2) // "456.70"
很酷,如果它是一个整数(零),显然使用parseFloat会删除剩下的小数.toFixed()一般来说,如果你想做数学,最好按照你的第一个例子。如果要在 UI 中显示数字,请使用.toFixed().
2021-03-11 02:19:03
嗯……这是有道理的,任何转换为​​数字的方式都必须始终去除错误的零,这就是它必须保持字符串的原因。我想它应该始终是显示前的最后一步,而不是用于计算。
2021-03-15 02:19:03
如果不存在 DP,我可以添加零吗?
2021-03-19 02:19:03
小心使用,.toFixed()因为它可能会为不同的浏览器返回不同的舍入结果。阅读这篇文章以了解有关该主题的详细信息!
2021-03-27 02:19:03
.toFixed()当您可能需要一个数字时,请小心使用,因为它会返回一个字符串。
2021-04-06 02:19:03
var number = 123.456;

console.log(number.toFixed(1)); // should round to 123.5
正如上面@cobby 提到的:小心使用,.toFixed()因为String当你可能想要一个时它会返回一个Number
2021-03-28 02:19:03
是的,即使只有几个小数,我也用 toFixed() 解决了故障。如果我没记错的话,它将分数 4 舍入到下一个更高的数字而不是更低的数字。
2021-04-01 02:19:03
有时会toFixed()出现故障 - 我在 Chrome 浏览器中看到它,我调用toFixed(),然后转换为字符串,它显示类似10.00000000068- 奇怪的东西虽然无法可靠地重现这一点。
2021-04-04 02:19:03

如果您使用,Math.round(5.01)您将得到5而不是5.0.

如果使用,toFixed则会遇到舍入 问题

如果您想要两全其美,请将两者结合起来:

(Math.round(5.01 * 10) / 10).toFixed(1)

您可能想为此创建一个函数:

function roundedToFixed(input, digits){
  var rounded = Math.pow(10, digits);
  return (Math.round(input * rounded) / rounded).toFixed(digits);
}

lodash有一个round方法:

_.round(4.006);
// => 4

_.round(4.006, 2);
// => 4.01

_.round(4060, -2);
// => 4100

文档

来源

我投票给toFixed(),但是,为了记录,这是另一种使用位移将数字转换为 int 的方法。因此,它总是向零舍入(正数向下,负数向上)。

var rounded = ((num * 10) << 0) * 0.1;

但是,嘿,因为没有函数调用,所以速度非常快。:)

这是使用字符串匹配的一个:

var rounded = (num + '').replace(/(^.*?\d+)(\.\d)?.*/, '$1$2');

我不建议使用字符串变体,只是说。