如何在Javascript中四舍五入一个数字?

IT技术 javascript rounding
2021-01-14 02:15:04

我想使用 Javascript 来四舍五入一个数字。由于数字是货币,我希望它像这些示例中那样四舍五入(2 个小数点):

  • 192.168 => 192.20
  • 192.11 => 192.20
  • 192.21 => 192.30
  • 192.26 => 192.30
  • 192.20 => 192.20

如何使用 Javascript 实现这一目标?内置的 Javascript 函数将根据标准逻辑对数字进行四舍五入(小于和大于 5 进行四舍五入)。

6个回答
/**
 * @param num The number to round
 * @param precision The number of decimal places to preserve
 */
function roundUp(num, precision) {
  precision = Math.pow(10, precision)
  return Math.ceil(num * precision) / precision
}

roundUp(192.168, 1) //=> 192.2
@codecowboy 如果你不这样做,那么ceil()会给你193,所以我们必须确保我们想要保留的所有精度都在小数点之前。然后我们进行逆操作以恢复“原始”值。
2021-03-16 02:15:04
请注意,此功能并不完全准确!roundUp(1.09, 2) 返回 1.1,这是错误的!预期的答案仍然是 1.09。
2021-03-21 02:15:04
如果你得到一些数字,如192.19999999999997,你可以申请.toFixed(1)num
2021-03-24 02:15:04
对于那些想知道如何四舍五入到最接近的整数的人来说,您只需要 Math.ceil()。剩下的就是处理小数了。为了节省其他人的时间,我的大脑才能做到这一点!
2021-03-26 02:15:04
@AndrewMarshall 乘以然后除以 10 的目的是什么?
2021-04-06 02:15:04

有点晚了,但是可以为此创建一个可重用的 javascript 函数:

// Arguments: number to round, number of decimal places
function roundNumber(rnum, rlength) { 
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

调用函数为

alert(roundNumber(192.168,2));
如果您希望正确四舍五入,不管您的目标是哪个小数位,这个答案都比接受的答案更好。例如:1.054 --> 1.05 1.055 --> 1.06 但是这里是一个边缘情况:1.005 --> 1 1.006 --> 1.01 AND 1.015 --> 1.01 1.016 --> 1.02 所以要小心。
2021-04-01 02:15:04
这很好用,但 OP 询问如何对数字进行四舍五入,因此此处应使用 Math.ceil 而不是 Math.round。
2021-04-08 02:15:04

正常四舍五入只需稍作调整即可:

Math.round(price * 10)/10

如果要保留货币格式,可以使用 Number 方法 .toFixed()

(Math.round(price * 10)/10).toFixed(2)

虽然这将使它成为一个字符串 =)

第二个不需要四舍五入,更像是 price.toFixed(2)
2021-03-19 02:15:04
Math.round(192.11 * 100)/100 -> 192.11
2021-03-27 02:15:04
@Krtek oop,感谢您发现它。我误读了这个问题。答案已更新。
2021-04-02 02:15:04
OP 询问如何对数字进行四舍五入,因此此处应使用 Math.ceil 而不是 Math.round。
2021-04-10 02:15:04

非常接近TheEye 的答案,但我更改了一些小东西以使其工作:

var num = 192.16;
    
console.log(    Math.ceil(num * 10) / 10    );

OP 期望两件事:
A. 向上取整到较高的十分之一,
B. 在百分之一位置显示零(货币的典型需求)。

满足这两个要求似乎需要针对上述每个要求单独的方法。这是一种建立在 suryakiran 建议答案基础上的方法:

//Arguments: number to round, number of decimal places.

function roundPrice(rnum, rlength) {
    var newnumber = Math.ceil(rnum * Math.pow(10, rlength-1)) / Math.pow(10, rlength-1);
    var toTenths = newnumber.toFixed(rlength);
    return toTenths;
}

alert(roundPrice(678.91011,2)); // returns 679.00
alert(roundPrice(876.54321,2)); // returns 876.60

重要提示:此解决方案会产生非常不同的结果,带有负数和指数数。

为了将此答案与两个非常相似的答案进行比较,请参阅以下两种方法。第一个简单地四舍五入到最接近的百分之一,第二个简单地四舍五入到最近的百分之一(更大)。

function roundNumber(rnum, rlength) { 
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

alert(roundNumber(678.91011,2)); // returns 678.91

function ceilNumber(rnum, rlength) { 
    var newnumber = Math.ceil(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

alert(ceilNumber(678.91011,2)); // returns 678.92