建议用第三方库bignumber.js。解决精度丢失,解决超大数运算。安装【npm i bignumber.js】。
https://www.npmjs.com/package/bignumber.js
https://github.com/MikeMcl/bignumber.js
//注意:超大数运算的参数必须是字符串,非字符串的超大数精度已丢失(得出的结果也是错误的)。运算的参数如果是空字符串或null或undefined,否则计算出的结果是NaN。计算出来的结果值只能是字符串,才能保证超大数的精度不丢失。
import BigNumber from "bignumber.js";
window.BigNumber = BigNumber;//全局变量
//相加【+】
BigNumber('1111222233334444555566').plus('34').toString(10);//输出:1111222233334444555600
//相减【-】
(new BigNumber(0.3)).minus(0.1).toString(10);//输出:0.2(精度不丢失)
//相乘【*(×)】
var x = new BigNumber(0.9);
x.multipliedBy(9).toString(10);
//相除【/(÷)】
BigNumber(0.9).dividedBy(9).toString(10);//输出:0.1
BigNumber("99999999999999999999999999999999.99999999999999999999999999999999").dividedBy("333333333333333333").toString(10);//输出:300000000000000.0003
//保留N位小数
BigNumber("1").dividedBy("3").toFixed(2);//保留2位小数,输出:0.33
BigNumber("0.100000").toFixed(6);//保留2位小数,输出:0.100000 。要想去掉后面的0,可用【Number("0.100000")】【parseFloat("0.100000")】【"0.100000".replace(/\.?0+$/, "")】。注:字符串转数字可能出现精度丢失。
//去掉小数末尾的0
BigNumber("0.100000").toFixed();//输出:0.1
BigNumber("0.100000").toString(10);//输出:0.1
//进制转换
BigNumber("9999999999999999999999.9999999").toString();//输出:9.9999999999999999999999999999e+21
BigNumber("9999999999999999999999.9999999").toString(10);//十进制输出:9999999999999999999999.9999999
BigNumber("8").toString(2);//二进制输出:1000
//字符串转数字
BigNumber("9.9999999999999999").toNumber();//输出:10。注意:字符串转数字会出现精度丢失。Number()与parseFloat()转换也无法避免精度丢失。
补充:第三方库【decimal.js】与【number-precision】虽然解决精度丢失,但是没有解决超大数运算。所以建议用【bignumber.js】进行运算。
下面的方法不建议使用:(请忽略)
//超大数加法(字符串相加) 两个正数据相加 一正一负相加 ,两个负数相加
function BigNumberPlus(num1, num2) {
if (["", null, undefined].includes(num1)) num1 = "0";
if (["", null, undefined].includes(num2)) num2 = "0";
let str1 = num1.toString().replace(/[^0-9.\-]/gi, ""); //保留整数,小数,负数,去掉百分比%等符号
let str2 = num2.toString().replace(/[^0-9.\-]/gi, ""); //保留整数,小数,负数,去掉百分比%等符号
let arr1 = str1.split("");
let arr2 = str2.split("");
let maxLen1 = Math.max(
str1.split(".")[0].length,
str2.split(".")[0].length,
0
); //整数部分的最大长度
let maxLen2 = Math.max(
(str1.split(".")[1] || "").length,
(str2.split(".")[1] || "").length,
0
); //小数部分的最大长度
//补全数据(必须保证两个数组长度相等,小数点的下标位置一样)
let addData = (arr, str) => {
if (maxLen2 > 0 && !arr.includes(".")) {
arr.push(".");
}
for (let index = 0; index < maxLen1 - str.split(".")[0].length; index++) {
arr.splice(0, 0, "0"); //向前面补0
}
for (
let index = 0;
index < maxLen2 - (str.split(".")[1] || "").length;
index++
) {
arr.push("0"); //向后面补0
}
};
addData(arr1, str1);
addData(arr2, str2);
// console.log(arr1.join(""), arr1.length);
// console.log(arr2.join(""), arr2.length);
let tenNum = 0; //相加得到十位数字
let sum = "";//相加的结果用字符串拼接
while (arr1.length || arr2.length || tenNum) {
let n1 = arr1.pop() || "0";
let n2 = arr2.pop() || "0";
if (n1 == "." && n2 == ".") {
sum = n2 + sum;
} else {
let val = Number(n1) + Number(n2) + tenNum;
tenNum = Math.floor(val / 10); //向下取整
sum = (val % 10) + sum;
}
}
if (sum.includes(".")) {
sum = sum.replace(/\.?0+$/, ""); //去掉小数末尾的0
sum = sum.replace(/^0+\./g, "0."); //把小数0开头的多余0去掉
}
sum = sum.replace(/^[0]+/, ""); //把整数0开头的多余0去掉
// console.log("sum: ", sum);
return sum;
}
BigNumberPlus("1022344", "888888.01");
//超大数减法(字符串相减) 两个负数相减,一正一负,
function BigNumberMinus(num1, num2) {
}