JS中小数运算
小数测试结果展示:
1、小数表示最多只能表示17位, 从17位开始产生误差;
2、小数点后,连续,0<=5位小数表示;0>=6位指数表示(1e-7);
3、小数相加存在误差(0.1 + 0.2)
整数测试结果展示:
1、整数最多表示21位数,22位数开始,使用指数表示
2、整数在第17位数开始,产生误差
3、整数相加
注意:
1、整数和小数都在17位数的时候开始有误差,建议小数精确值不超过16位;
2、整数计算值值差超过17位,表示会有误差;
结论: 小数相加存在误差,计算时先转换为整数相加,再做除法;
小数相加计算方法:
// 获取小数位数
function getLength(num: number) {
let sq;
try {
const numString = num.toString()
if (numString.search('e') !== -1) {
const length = parseInt(numString.split('e')[1])
sq = Math.abs(length)
} else {
sq = num.toString().split(".")[1].length;
}
} catch {
sq = 0;
}
return sq;
}
// 小数相加计算(建议小数精确值不超过16位)
function addNum (num1: number, num2: number) {
let sq1, sq2, multiple;
sq1 = getLength(num1)
sq2 = getLength(num2)
multiple = Math.pow(10, Math.max(sq1, sq2) + 1);
return (num1 * multiple + num2 * multiple) / multiple;
}
addNum(0.1, 1e-16) // 0.1000000000000001
addNum(0.1, 1e-17) // 0.10000000000000002 有误差