← 中文资源

简体中文版本

安全地按小数位四舍五入

通过缩放与 epsilon 修正把有限数字舍入到指定小数位,并用固定位数格式化输出。

阅读英文原文

功能说明

JavaScript 的浮点数四舍五入常出现 1.005 变成 1.00 的问题。该函数先把数字通过指数移位放大到整数尺度,使用 Math.round 取整,再反向移位缩小回原尺度,并限制小数位数量,避免异常输入。formatFixed 在舍入后调用 toFixed,适合金额展示和报表导出。

关键代码

roundTo 校验有限数字与 0 到 15 的整数小数位,shiftDecimal 通过字符串指数调整把绝对值放大到整数尺度,再用 Math.round 取整,乘符号后反向移位。formatFixed 重复校验小数位,先舍入再输出固定位数,确保 1.2 显示为 1.20。

const shifted = shiftDecimal(Math.abs(value), decimals);
const rounded = Math.round(shifted);
return Math.sign(value) * shiftDecimal(rounded, -decimals);

使用注意

指数移位能规避部分二进制浮点误差,但仍不能解决所有精度问题,金额计算建议使用整数分。极大数乘以因子可能溢出为 Infinity,调用前应评估数量级。小数位上限为 15,负数和超过上限抛 RangeError。该函数对负数采用远离零的方向舍入。

验证方式

断言 roundTo(1.005, 2) 返回 1.01,roundTo(-1.005, 2) 返回 -1.01,roundTo(2.5, 0) 返回 3。formatFixed(1.2, 2) 返回 1.20。decimals 为 -1 或 16 抛 RangeError,value 为 NaN 抛 TypeError。0 与负数小数位边界应保持稳定。