You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// num表示需要四舍五入的小数
// s表示需要保留几位小数
function toFixed(num, s) {
var times = Math.pow(10, s);
var des = num * times + 0.5;
des = parseInt(des, 10) / times;
return des + '';
}
调用方法如下:
console.log(toFixed(0.335,2));//0.34
方法二:重写toFixed方法:
Number.prototype.toFixed = function (s) {
var times = Math.pow(10, s);
var des = this * times + 0.5;
des = parseInt(des, 10) / times;
return des + '';
};
前言
在项目中计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前一碰到这个问题就用tofixed方法进行处理一下,这对于一个程序员来说是及其不严谨的。何况用tofixed方法也是有问题的。如下问题:
解决方法有下面两种:
** 方法一:(定义一个全局方法,直接调用)**
调用方法如下:
方法二:重写toFixed方法:
调用方法如下:
1、发现问题:
在测试js浮点数进行加减乘除计算时,都可能出现问题,如下:
console.log(0.1 + 0.2);//0.30000000000000004
console.log(1.0 - 0.9);//0.09999999999999998
console.log(19.9 * 100);//1989.9999999999998
console.log(6.6 / 0.2);//32.99999999999999
2、不精准原因:
下面我们来说一下浮点数运算产生误差的原因:(拿0.1+0.2=0.30000000000000004进行举例)
首先,我们要站在计算机的角度思考 0.1 + 0.2 这个看似小儿科的问题。我们知道,能被计算机读懂的是二进制,而不是十进制,所以我们先把 0.1 和 0.2 转换成二进制看看:
0.1 => 0.0001 1001 1001 1001…(无限循环)
0.2 => 0.0011 0011 0011 0011…(无限循环)
上面我们发现0.1和0.2转化为二进制之后,变成了一个无限循环的数字,这在现实生活中,无限循环我们可以理解,但计算机是不允许无限循环的,对于无限循环的小数,计算机会进行舍入处理。进行双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 ,因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。
注:十进制与二进制之间的转换
3、解决办法:
调用方法:
The text was updated successfully, but these errors were encountered: