1计算精度丢失 0.1+0.2 !=0.3
原理:https://mp.weixin.qq.com/s/I6uOfr9ybx3-Q4nwdWJvTw
0.1+0.2 不等于 0.3 ,因为在 0.1+0.2 的计算过程中发生了两次精度丢失。第一次是在 0.1 和 0.2 转成双精度二进制浮点数时,由于二进制浮点数的小数位只能存储52位,导致小数点后第53位的数要进行为1则进1为0则舍去的操作,从而造成一次精度丢失。第二次在 0.1 和 0.2 转成二进制浮点数后,二进制浮点数相加的过程中,小数位相加导致小数位多出了一位,又要让第53位的数进行为1则进1为0则舍去的操作,又造成一次精度丢失。最终导致 0.1+0.2 不等于0.3 。
方法 四舍五入
//number 数字 m 位数
var a=function(number,m){return Math.round(Math.pow(10, m) * number) / Math.pow(10, m)}
2.toFixed 四舍五入 浏览器兼容
https://mp.weixin.qq.com/s/6O__uJsjROFioPqNGBRs0Q
谷歌,火狐 ,ie 在 1.45.toFixed(1) 四舍五入的计算结果不同 造成金额计算不同(计算金额bug)
假设要四舍五入的数字为number,要保留n位小数,可以先用 ,然后用 Math.round()
取整,最后在除去,间接实现四舍五入。另外toFixed()
还有个自动补零的功能,也要实现一下,故下面简单封装了一个toFixed方法来实现四舍五入。
//toFixed 计算小数点
bug处理
function toFixed(number, m) {
if (typeof number !== 'number') {
throw new Error("number不是数字");
}
let result = Math.round(Math.pow(10, m) * number) / Math.pow(10, m);
result = String(result);
if (result.indexOf(".") == -1) {
if(m != 0){
result += ".";
result += new Array(m + 1).join('0');
}
} else {
let arr = result.split('.');
if (arr[1].length < m) {
arr[1] += new Array(m - arr[1].length + 1).join('0')
}
result = arr.join('.')
}
return result
}