JS如何将科学计数法转换成数字或者字符串?

遇到了一个问题,我的页面中有输入框供用户输入数字,但是如果用户输入的数字过大的话,js会自动转换成科学计数法显示。但是我还需要把用户输入的内容发送到后台以及展示在页面中。
这样的话在页面中也展示了科学计数法,影响用户体验。而且后台也无法识别这个科学计数法的数字,造成错误。
由于我需要拿用户输入的内容来进行加减运算,所以不能把输入的内容转换成字符串。
所以,希望大家能够提供一些方法或者思路,将这个自动转换出来的科学计数法再转换成数字或者字符串。
我写了一个小demo,类似于下面的情况:

    var a = 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;
    var b = 222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222;
    var c = a + b;
    console.log(a);
    console.log(b);
    console.log(c);

这段代码的输出结果是:
clipboard.png
我期望的输出结果是:

clipboard.png
希望大家可以提供一些方法或者思路,谢谢大家~
百度的方法基本都试过了,都没有效果。

阅读 47.3k
5 个回答
var num = new Number('1.111e+84')
num = num.toLocaleString()

然而在转成科学计数法的时候能够保留的小数位数有限 ——。

其实我也是最近遇到这个问题,我发现 0.000000001 这样的数字会被转成科学计数法,但是小数点前面要是有一个非0的数字就不会自动转了,所以我是这么搞的,测试了常见的浏览器没有啥问题:

let num = 0.00000001;
let result = String(num);

// 判断一下有没有减号
if (result.indexOf('-') >= 0) {
    result = '0' + String(Number(result) + 1).substr(1);
}

现在的result应该是没有问题了。

刚写的,有什么不对可以告诉一下

/**
 * @description 科学计数法转为string
 * @param {string, number} param
 */
function scientificNotationToString(param) {
  let strParam = String(param)
  let flag = /e/.test(strParam)
  if (!flag) return param

  // 指数符号 true: 正,false: 负
  let sysbol = true
  if (/e-/.test(strParam)) {
    sysbol = false
  }
  // 指数
  let index = Number(strParam.match(/\d+$/)[0])
  // 基数
  let basis = strParam.match(/^[\d\.]+/)[0].replace(/\./, '')

  if (sysbol) {
    return basis.padEnd(index + 1, 0)
  } else {
    return basis.padStart(index + basis.length, 0).replace(/^0/, '0.')
  }
}

clipboard.png

clipboard.png

由于我需要拿用户输入的内容来进行加减运算,所以不能把输入的内容转换成字符串。

本质上不是什么“使用哪种方式显示数字”的问题。

在你的数字过大场景下,前端没有 Decimal 这种类型,或者你找专门的 js 的库来做,比如 https://github.com/MikeMcl/de...,否则精度无法保存,结果也就无法保证的。

另一种方法,就是让后端提供“运算服务”,你传字符串,得到的也是字符串,比如传: op=add&args=12345,1 ,后端响应 12346

今天遇到这个问题。。。。

function sumStrings(a, b) {//输入的a,b都是只包含数字的字符串
    var output;
    output = a * 1 + b * 1;//转换为数字
    if (output.toString().indexOf("+") == -1) {//判断不为科学计数法输出
        output = output.toString();
    } else {//判断为科学计数法输出
        a = a.split("");//字符串分割数组
        b = b.split("");//字符串分割数组
        if (a.length > b.length) {
            output = test(a, b);
        } else {
            output = test(b, a);
        }
    }
    return output;
}
//把科学计数法准换为数字
function test(a, b) {//要求a的长度比b的长度大
    var i, arr = [],
        j = 0;
    for (i = 0; i < a.length; i++) {
        if (i < b.length) {//在共有的位进行操作
            var c = a[a.length - i - 1] * 1 + b[b.length - i - 1] * 1;//取得同位相加数
            if (c < 10) {//判断同位相加数小于10
                if (j + c === 10) {//判断位数加进位数为10
                    arr.unshift(0);//位数为0
                    j = 1;//重置进位为1
                } else {//判断位数加进位数不为10
                    arr.unshift(j + c);//位数为进位加同位相加数
                    j = 0;//重置进位为0
                }
            } else {//判断同位相加数大于等于10
                arr.unshift(c + j - 10);//位数为c+j-10
                j = 1;//重置进位为1
            }
        } else {//非共有的位操作
            var c = a[a.length - i - 1] * 1;//取得位
            if (j === 1) {//进位判断
                if ((j + c) === 10) {//判断位数加进位数为10
                    arr.unshift(0);//位数为0
                    j = 1;//重置进位为1
                } else {//判断位数加进位数不为10
                    arr.unshift(j + c);//位数为进位加同位相加数
                    j = 0;//重置进位为0
                }
            } else {
                arr.unshift(c);//进位为0,直接放入
            }
        }
    }
    if (j === 1) { arr.unshift(1) }//最后判断若a和b同长度,且首位相机大于等于0是,数组添加一位1
    return arr.join("");//最后字符串形式输出
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏