保留小数位-toFixed的坑
Contents
背景
开发过程中,遇到 需要对小数进行四舍五入的需求:首先想到的是 Number.toFixed(pre) 这个 API 的使用。
问题
预期的四舍五入结果:
65967.005.toFixed(2) // 65967.01
12859.005.toFixed(2) // 12859.01
控制台实际输出的结果:
65967.005.toFixed(2) // 65967.01 正确
12859.005.toFixed(2) // 12859.00 错误
原因
js的浮点数计算 。详见stackoverflow
解决办法
- 封装函数
const toFixed = function (value: number, percision: number) {
return Math.round(value * Math.pow(10, percision)) / (Math.pow(10, percision))
};
toFixed(65967.005, 2) // 65967.01
toFixed(12859.005, 2) // 12859.01
- 使用数字库
import { Decimal } from 'decimal.js';
const number = new Decimal(65967.005);
// 四舍五入到小数点后两位
const roundedNumber = number.toDecimalPlaces(2);
console.log(roundedNumber.toString()); // 65967.01