想要在Javascript中对数字进行精确的加减乘除运算,就需要使用浮点数(float)。但是Javascript在处理浮点数时可能会出现精度问题,比如:
console.log(0.1 + 0.2); // 0.30000000000000004console.log(1.0 - 0.9); // 0.09999999999999998console.log(0.7 * 0.1); // 0.07000000000000001console.log(0.8 / 0.1); // 7.999999999999999
上面的结果显然与数学的预期不符,这是因为Javascript中采用IEEE 754标准进行浮点数表示和运算,但是这个标准并不是精确的。
那么,在Javascript中如何避免这种精度问题呢?下面有几个方法:
方法一:使用Math库函数
在进行加减乘除运算时,可以使用Math库函数进行处理。其中,Math.round()可以对数字四舍五入:
console.log(Math.round(0.1*10 + 0.2*10)/10); // 0.3console.log(Math.round(1.0*10 - 0.9*10)/10); // 0.1console.log(Math.round(0.7*10 * 0.1*10)/100); // 0.07console.log(Math.round(0.8*10 / 0.1*10)/10); // 8
上面的代码中,乘以10是为了将小数位移到整数位,然后使用Math.round()进行四舍五入,最后除以10或者100将小数位还原。
方法二:使用toFixed()函数
另一种方法是使用toFixed()函数,它可以将数字保留指定的小数位:
console.log((0.1 + 0.2).toFixed(1)); // 0.3console.log((1.0 - 0.9).toFixed(1)); // 0.1console.log((0.7 * 0.1).toFixed(2)); // 0.07console.log((0.8 / 0.1).toFixed(0)); // 8
注意,使用toFixed()函数会将结果转换为字符串,所以需要注意数据类型。
方法三:使用第三方库
除此之外,还可以使用第三方库来处理浮点数精度问题,比如Big.js、Decimal.js等。
使用Big.js的示例代码如下:
var num1 = new Big(0.1);var num2 = new Big(0.2);console.log(num1.plus(num2).toString()); // 0.3
使用Decimal.js的示例代码如下:
var num1 = new Decimal(0.1);var num2 = new Decimal(0.2);console.log(num1.plus(num2).toString()); // 0.3
经过上述处理,就可以让Javascript在处理浮点数时更加精确。