59

我有一个字符串e.g: "4.874915326E7"。将其转换为 javascript 数字格式的最佳方法是什么?(整数或浮点数)?如果我尝试 parseInt(),最后的E将被忽略。

4

6 回答 6

87

编辑:

这个答案似乎引起了一些混乱。最初的问题是询问如何将字符串形式的科学记数法转换为数字(以便可以用于计算)。但是,找到此答案的大量人似乎认为这是关于将 javascript 表示为科学记数法的数字转换为更美观的格式。如果这实际上是您的目标(演示),那么您应该将数字转换为字符串。请注意,这意味着您将无法在计算中轻松使用它。

原答案:

将其作为字符串传递给 Number 函数。

Number("4.874915326E7") // returns 48749153.26
Number("4E27") // returns 4e+27

将科学计数法中的数字转换为字符串:

这最好由另一个问题来回答,但从那个问题我个人喜欢使用的解决方案.toLocaleString()。请注意,该特定解决方案不适用于负数。为了您的方便,这里有一个例子:

(4e+27).toLocaleString('fullwide', {useGrouping:false}) // returns "4000000000000000000000000000"
于 2012-06-08T06:29:45.103 回答
11

尝试这样的事情

演示

Number("4.874915326E7").toPrecision()
于 2012-06-08T06:36:34.123 回答
10

您还可以+在字符串前面使用符号来获取数字。

+"4.874915326E7" // == 48749153.26
于 2016-02-04T18:36:42.960 回答
8

我有这样的价值,3.53048874968162e-09并且使用Number.toFixed(20)对我有用:

value = new Number('3.53048874968162e-09')
//[Number: 3.53048874968162e-9]
value.toFixed(20)
//'0.00000000353048874968'
于 2020-05-19T21:52:50.077 回答
2

使用 MathJs 库对我来说效果最好,尝试了很多这些答案,但在某些情况下它们都不能正常工作。这非常有效。更多信息请访问https://mathjs.org/

解决方案,添加 MathJS,然后像这样调用它:

<script src="https://cdn.jsdelivr.net/npm/mathjs@8.0.1/lib/browser/math.js"  crossorigin="anonymous"></script>
    
    function toPlainString(num) {
        return math.format(num,  {notation: 'fixed'});
    }
于 2020-11-17T19:23:28.350 回答
1

前言

尽管其他答案已经足够且正确,但为了能够正确解析字符串中的数字,了解类型强制(在您的情况下为转换)至少在高级别上如何工作很有用。

强制规则

parseInt当您调用, parseFloat,Number构造函数或一元运算符等实用程序时,有一些规则定义了如何执行转换+

parseInt(<value>, [radix])功能:

  • 忽略前导空格 ( " 24"-> 24)
  • 空字符串返回NaN
  • 第一个非数字字符完成解析(" 42answer"-> 42
  • 在上述规则下,小数位也完成解析

第三条规则正是为什么忽略指数部分(ExponentPart标准中定义的ExponentIndicator和组成) - 一旦遇到字符,解析停止并且函数返回到目前为止解析的数字。事实上,它更早停止 - 当第一次遇到小数点时(参见最后一条规则)。SignedIntegere

parseFloat()与 相同parseInt,除了:

  • 它解析第一个小数点
  • 忽略前导0(因此无法解析十六进制)

根据经验,您应该parseInt在转换为“整数”和parseFloat“浮点”时使用(注意它们实际上是相同的类型)。

Number()构造函数和一元+

  • 对于 boolean -> trueto 1, falseto0

  • 对于null-> 0(因为null是假的)

  • 对于undefined->NaN

  • 对于数字:直通

  • 对于字符串:

    • 只有数字 [0-9] 字符,以数字或+--> 数字(整数)开头
    • 相同,但包含浮点 -> 数字(浮点)
    • 包含十六进制 -> 数字(整数)
    • 空字符串->0
    • 所有其他情况->NaN
  • 对于对象,valueOf()调用它们的方法。如果结果为NaN,则toString()调用方法。在引擎盖下,对象被转换为基元,而基元被转换为数字。

  • 对于符号和 BigInts ->TypeError被抛出

数字格式注意事项

由于该问题仍然吸引与格式有关的答案和评论(如已接受的答案所有效说明的那样),因此应该说明:

应用于编程,“数字格式”有一个严格的含义:
数值的表示

“转换”也有严格意义上的类型转换(见标准

ECMAScript 实现双精度 64 位格式,这是它唯一的“格式”。该问题询问有关将 String 转换为数字格式的问题,因此答案应提供以下信息:

给定值表示电子符号中的数字,如何将字符串转换为数字

参考

  1. ToNumber ECMAScript 标准中的抽象操作
  2. 我在这个主题和其他许多方面的最佳读物之一:Matt Frisbie 的“面向 Web 开发人员的专业 Javascript”。
  3. 类型强制解释(博客文章
于 2020-05-20T02:17:56.550 回答