【问题标题】:How to convert a String containing Scientific Notation to correct Javascript number format如何将包含科学记数法的字符串转换为正确的 Javascript 数字格式
【发布时间】:2021-12-05 08:16:27
【问题描述】:

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

【问题讨论】:

  • 这通常称为Scientific Notation(有时称为科学 E 表示法,但无论如何......)
  • 已更改问题标题,谢谢

标签: javascript string numbers format


【解决方案1】:

编辑:

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

原答案:

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

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

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

another question 最好回答这个问题,但从这个问题我个人喜欢the solution that uses .toLocaleString()。请注意,该特定解决方案不适用于负数。为方便起见,以下是一个示例:

(4e+27).toLocaleString('fullwide', {useGrouping:false}) // returns "4000000000000000000000000000"

【讨论】:

  • 我的不工作。 Number("1.7976931348623157e308")
  • @The_ehT 它对我有用。当我在控制台中运行该确切代码时,typeof Number("1.7976931348623157e308") 会为我返回“数字”。在没有typeof 的控制台中运行它会返回数字“1.7976931348623157e+308”。
  • @JosephMarikle 但我希望我的数字采用标准符号而不是科学符号。
  • @The_ehT 啊!这就说得通了。这个问题是关于如何将其转换为“javascript 数字格式”,大概是为了允许使用它和其他数字,对数值执行数学运算。您想将您的转换为扩展格式,您需要一个字符串。试试这个答案:stackoverflow.com/questions/16139452/…
  • 感谢您的回复。我可以这样转换,但如果我这样做,一些数字会丢失。例如。我有一个递归函数,其中最后一个答案像 4.12345678e10,如果我将其转换为标准符号,它会导致像这样的 41234567800,其中最后两位数字 00 实际上不是 00。所以如果有一种方法可以防止转换为科学记数法或任何其他技巧。
【解决方案2】:

试试这样的

Demo

Number("4.874915326E7").toPrecision()

【讨论】:

  • .toPrecision() 这里不需要,如果精度低于提供的字符串,则添加科学计数法。
  • Number("2.2356434336665664e+51").toPrecision() 这不起作用..请帮我纠正这个问题。
【解决方案3】:

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

+"4.874915326E7" // == 48749153.26

【讨论】:

  • 也适用于变量,即使在字符串中:x="1e3"; ":"+(+x) 给出 ":1000"。
【解决方案4】:

我有这样的价值 3.53048874968162e-09 并使用 Number.toFixed(20) 为我工作:

value = new Number('3.53048874968162e-09')
//[Number: 3.53048874968162e-9]
value.toFixed(20)
//'0.00000000353048874968'

【讨论】:

  • 请考虑添加解释为什么它起作用和参考,特别是在向旧问题添加一个时(此类答案进入审核队列)。请注意,问题不是关于格式化表示数字的字符串,而是关于 converting 到数字格式(尽管考虑到 q. 的公式化方式,混淆是可以理解的)。
  • 另外,你不应该创建新的Number对象new Number()只是为了进行类型转换,直接使用Number()(将返回一个原始类型)
【解决方案5】:

使用 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'});
    }

【讨论】:

    【解决方案6】:

    序言

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

    强制规则

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

    parseInt(&lt;value&gt;, [radix])函数:

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

    第三条规则正是为什么指数部分(ExponentPartExponentIndicatorSignedInteger 组成,如standard 中定义)被忽略 - 一旦遇到e 字符,解析停止并且函数返回到目前为止解析的数字。事实上,它在第一次遇到小数点时停止(参见最后一条规则)。

    parseFloat()parseInt 相同,除了:

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

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

    Number()构造函数和一元+

    • 对于布尔值 -> true1false0

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

    • 对于undefined -> NaN

    • 对于数字:传递

    • 对于字符串:

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

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

    数字格式说明

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

    应用于编程,有严格意义上的“数字格式”
    数值的表示

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

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

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

    参考文献

    1. ToNumber abstract operation 在 ECMAScript 标准中
    2. 我在这个主题和其他许多方面的最佳读物之一:Matt Frisbie 的“面向 Web 开发人员的专业 Javascript”。
    3. 类型强制解释 (blog post)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      相关资源
      最近更新 更多