js超大数运算加减乘除

建议用第三方库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) {
    
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容