js

JS 四舍五入并保留两位小数

作者: shaokang 时间: February 17, 2025字数:960

前言

前端经常需要将一个数字进行四舍五入并保留两位小数,如何实现并保证精确不存在问题?下面将介绍几种常见的方式。

Math.round

直接用 Math.round 函数只能将其四舍五入为整数,并不能保留小数

Math.round(0.4); // 0
Math.round(0.5); // 1
Math.round(1.1); // 1
Math.round(1.5); // 2

❎ 配合整除 100

通过将数字放大指定倍数(如 100),进行四舍五入后再缩小回来。

function round(num) {
    return Math.round(num * 100) / 100;
}
round(1.141); // 1.14
round(1.145); // 1.15

看起来符合要求,但多加测试发现有些转换会有问题

round(1.005); // 1

❎ 配合 Number.EPSILON 修正精度

用 Number.EPSILON 避免浮点数精度问题。

function round(num) {
    return Math.round((num + Number.EPSILON) * 100) / 100;
}
round(1.141); // 1.14
round(1.145); // 1.15
round(1.005); // 1.01

还是有问题:

round(5.015); // 5.01

✓ 配合幂运算

利用科学计数法进行四舍五入,可以避免某些精度问题。

function round(num) {
    return Number(Math.round(num + 'e2') + 'e-2');
}

round(2.345); // 2.35
round(5.015); // 5.02
round(1.005); // 1.01

看起来没问题,lodash round 方法也是基于科学计数法来实现的。

❎ toFixed

function round2(num) {
    return parseFloat(num.toFixed(2));
}

round(5.015); // 5.01

toFixed 并不能实现真正的四舍五入,它跟银行家算法有关。

三方库

除此之外还可以使用 BigDecimal、Decimal.js 用于高精度需求。