问题
浮点数,常用的办法是四舍五入保留2位小数来解决。但是在向上、向下保留小数的时候,比如:0.1+0.2=0.30000000000000004,向上保留2位小数就变成了0.31。
大整数,在超出Number的最大安全整数时,计算也会存在精度问题。
原因
二进制最大尾数是52位,超出长度的部分计算就会丢失精度
解决办法
浮点数使用 js-big-decimal 计算浮点数
npm官网:js-big-decimal - npm
安装
npm i js-big-decimal -S
封装方法 /utils/big-decimal.js
import bigDecimal from "js-big-decimal";export default {// 声明state(number) {return new bigDecimal(number);},// 加add(number1, number2) {return bigDecimal.add(number1, number2);},// 减subtract(number1, number2) {return bigDecimal.subtract(number1, number2);},// 乘multiply(number1, number2) {return bigDecimal.multiply(number1, number2);},// 除// precision: 精确度,默认最多保留8位小数divide(number1, number2, precision = 8) {// 添加number,移除小数末尾多余0return Number(bigDecimal.divide(number1, number2, precision));},/*** 保留小数* length: 小数位长度,默认两位小数* option:选项,默认四舍五入* HALF_EVEN 四舍五入* CEILING 向上取* DOWN 向下取*/round(number, length = 2, option = "HALF_EVEN") {const num = new bigDecimal(number);return num.round(length, bigDecimal.RoundingModes[option]).getValue();},// 绝对值abs(number) {return bigDecimal.abs(number);},// 向上取整ceil(number) {return bigDecimal.ceil(number);},// 向下取整floor(number) {return bigDecimal.floor(number);},
};
使用
import decimal from '@/utils/big-decimal';
decimal.add(0.1, 0.2);
大数使用bignumber.js
npm官网:bignumber.js - npm
安装
npm install bignumber.js -S
使用
a = new BigNumber(1011, 2) // "11"
b = new BigNumber('zz.9', 36) // "1295.25"
c = a.plus(b) // "1306.25"