JavaScript小数进行数值运算时出现精度丢失问题
1. 原因:JavaScript 的number类型在进行运算时都先将十进制转二进制,此时,小数点后面的数字转二进制时会出现无限循环的问题。为了避免这一个情况,要舍0进1,此时就会导致精度丢失问题。
2. 如何解决:
(1)保留小数位数toFixed()
const numObj = 12345.6789; numObj.toFixed(); // '12345':四舍五入,没有小数部分 numObj.toFixed(1); // '12345.7': 向上舍入 numObj.toFixed(6); // '12345.678900': 小数点后不够六位,用0补足位数 (2.34).toFixed(1); // '2.3' (2.35).toFixed(1); // '2.4': 向上舍入 (2.55).toFixed(1); // '2.5': 向下舍入,因为无法用浮点数精确表示 (2.449999999).toFixed; // '2.5':向上舍入,因为2.449999999的差值小于Number.EPSILON // 注:在ES6中,Number.EPSILON表示1与大于1的最小浮点数之间的差。 // 实际上是JavaScript能够表示的最小精度。如果误差小于这个值,则认为没 // 有意义,即不存在误差。引入这个最小精度的目的是为了浮点数的计算(浮 // 点数计算不精确)
(2)保留几位小数,就先乘以位数的倍数,然后再除(描述得不是很好;这个方法不一定有效)
比如:要保留1位小数,就乘以10,然后再除10;要保留2位小数,就乘以100,然后再除以100
// 保留2位小数 (2.67*100-1.3*100)/100
参考链接:Number.prototype.toFixed() - JavaScript | MDN (mozilla.org)
js小数运算出现的问题(精度丢失)及解决办法_js减法小数位精度丢失-CSDN博客