我们知道, js里面的计算有时候是有误差的,是因为JavaScript使用二进制表示浮点数,因此不能精确表示所有十进制数
比如0.1 + 0.2不等于0.3
0.14 * 100不等于14
我一般是用这个函数处理的
Math.signFigures = function(num, rank = 6) {
if(!num) return(0);
const sign = num / Math.abs(num);
const number = num * sign;
const temp = rank - 1 - Math.floor(Math.log10(number));
let ans;
if (temp > 0) {
ans = parseFloat(number.toFixed(temp));
}
else if (temp < 0) {
ans = Math.round(number / Math.pow(10, temp)) * temp;
}
else {
ans = Math.round(number);
}
return (ans * sign);
};
这个函数是从网上来的, 比如计算0.1 + 0.2, Math.sign(0.1 + 0.2)就很准确的等于0.3
我没明白这个函数的运行原理是啥, 看不懂
数学函数
Math.log10(x) :以10为底的x的对数
Math.pow(x,y):x的y次方
Math.abs(x):x的绝对值
Math.floor(x):使x向下取整
x.toFixed:对x定点
Math.round(x):对x进行四舍五入
一些主要的代码
上面是获取num的符号, 当num > 0, sign = 1; num < 0 , sign = -1; num = 0 情况 if(!num) return(0) 已经排除;
上面x的位数比y的值多
1
, 那么 y + 1 就等于 x的位数; 但是log10(x)大多数情况下存在小数, 比如log10(88) = 1.94448..; 对此可以使用Math.floor(x) 向下取整,Math.floor(Math.log10(88)) = 1;所以1 + Math.floor(Math.log10(number)
就是计算num的整数
位数;上面rank 默认设置为 6,
也许是
单精度浮点数在大多数平台能够保证6位有效数字;基于此
, 可以对原来的浮点数进行一些转换来解决丢失精度的问题。1 + Math.floor(Math.log10(number) 是计算num的整数部分的位数, 令rank = 6, temp的含义是以6位有效数字的长度为分界点进行讨论:
其他