javascript - JavaScript 中如何避免对大数使用科学记数法?

标签 javascript

当在字符串上下文中使用时,JavaScript 会将超过 21 位数字的整数转换为科学记数法。我正在打印一个整数作为 URL 的一部分。如何防止转换发生?

最佳答案

Number.toFixed ,但如果数字 >= 1e21 且最大精度为 20,则使用科学记数法。除此之外,您可以自己滚动,但会很困惑。

function toFixed(x) {
  if (Math.abs(x) < 1.0) {
    var e = parseInt(x.toString().split('e-')[1]);
    if (e) {
        x *= Math.pow(10,e-1);
        x = '0.' + (new Array(e)).join('0') + x.toString().substring(2);
    }
  } else {
    var e = parseInt(x.toString().split('+')[1]);
    if (e > 20) {
        e -= 20;
        x /= Math.pow(10,e);
        x += (new Array(e+1)).join('0');
    }
  }
  return x;
}

上面使用了廉价的“n”简单的字符串重复((new Array(n+1)).join(str))。您可以使用俄罗斯农民乘法定义 String.prototype.repeat 并使用它。

这个答案应该只适用于问题的上下文:显示大量数字而不使用科学记数法。对于其他任何事情,您应该使用 BigInt库,例如BigNumber ,柠檬的BigInt ,或BigInteger 。展望 future ,新本土BigInt (注意:不是 Leemon 的)应该可用; Chromium以及基于它的浏览器( Chrome 、新的 Edge [v79+]、 Brave )和 Firefox都有支持; Safari 的支持正在进行中。

以下是使用 BigInt 的方法:BigInt(n).toString()

示例:

const n = 13523563246234613317632;
console.log("toFixed (wrong): " + n.toFixed());
console.log("BigInt (right):  " + BigInt(n).toString());

请注意,但是,您输出为 JavaScript 数字(不是 BigInt)的任何大于 15-16 位数字(具体来说,大于 Number.MAX_SAFE_INTEGER + 1 [9,007,199,254,740,992]) 可能会被舍入,因为 JavaScript 的数字类型(IEEE-754 double 浮点)无法精确保存超出该点的所有整数。从 Number.MAX_SAFE_INTEGER + 1 开始,它以 2 的倍数工作,因此它不能再容纳奇数(同样,在 18,014,398,509,481,984 时,它开始以 4 的倍数工作,然后是 8,然后是 16, ...)。

因此,如果您可以依赖 BigInt 支持,请将您的数字作为传递给 BigInt 函数的字符串输出:

const n = BigInt("YourNumberHere");

示例:

const n1 = BigInt(18014398509481985); // WRONG, will round to 18014398509481984
                                      // before `BigInt` sees it
console.log(n1.toString() + " <== WRONG");
const n2 = BigInt("18014398509481985"); // RIGHT, BigInt handles it
console.log(n2.toString() + " <== Right");

关于javascript - JavaScript 中如何避免对大数使用科学记数法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26758543/

相关文章:

React setState 中的 JavaScript 使用

javascript - jquery 禁用/删除选择选项?

javascript - jQuery 和 YUI (yahoo ui)

javascript - AngularJS - 如果输入不是数字,如何输入数字 0

javascript - 如何使用 "onclick"分隔输出并将数据格式化为每页 20 个?

javascript - 在卸载前执行服务器 API 调用/页面卸载的限制?

javascript - 调用方法时 meteor 进入路由

javascript - 是否有更好的条件 setTimeout 模式?

javascript - jQuery 获取 beforeunload 事件源 id

javascript - 使用python或js将带有dynamic-css的html下载为pdf