我有一个字符串 例如:"4.874915326E7"
。如何将其转换为JavaScript数字格式(整数或浮点数)?如果我尝试使用parseInt()函数,那么末尾的E会被忽略。
我有一个字符串 例如:"4.874915326E7"
。如何将其转换为JavaScript数字格式(整数或浮点数)?如果我尝试使用parseInt()函数,那么末尾的E会被忽略。
这个答案似乎引起了一些混淆。原问题是问如何把表示为字符串的科学计数法转换成数字(以便用于计算)。然而,很多人找到这个答案似乎认为它是关于将被javascript表示为科学计数法的数字转换为更具可呈现性的格式。如果你的目标确实是这样(表现),那么你应该将数字转换为字符串。请注意,这意味着你将无法像使用数字那样轻松地进行计算。
将其作为字符串传递给Number函数。
Number("4.874915326E7") // returns 48749153.26
Number("4E27") // returns 4e+27
这个问题最好通过另一个问题来回答,但是我个人喜欢使用.toLocaleString()
的解决方案。请注意,该特定解决方案不适用于负数。以下是一个示例以供参考:
(4e+27).toLocaleString('fullwide', {useGrouping:false}) // returns "4000000000000000000000000000"
Number("1.7976931348623157e308")
- The_ehTtypeof Number("1.7976931348623157e308")
返回"Number"。如果不使用typeof
在控制台中运行它,则返回数字"1.7976931348623157e+308"。 - Joseph Marikle我有这样一个值 3.53048874968162e-09
,使用 Number.toFixed(20)
对我很有帮助:
value = new Number('3.53048874968162e-09')
//[Number: 3.53048874968162e-9]
value.toFixed(20)
//'0.00000000353048874968'
new Number()
来执行类型转换,而是直接使用 Number()
(将返回原始类型)。 - Oleg Valter is with Ukraine.toPrecision()
,如果精度低于提供的字符串,它会添加科学计数法。 - Cees Timmerman+
来得到一个数字。+"4.874915326E7" // == 48749153.26
x="1e3"; ":"+(+x)
得到的结果是 :1000
。 - Cees Timmerman+"1e20"
之后无法工作,例如+"1e21"
返回1e21
。 - BitOfUniverse前言
虽然其他答案足够且正确,但为了能够正确地从字符串中解析数字,至少需要了解类型强制转换(在您的情况下是转换)的工作原理。
强制转换规则
当您调用像parseInt
、parseFloat
、Number
构造函数或+
一元运算符这样的实用程序时,有一些规则定义了如何执行转换:
parseInt(<value>, [radix])
函数:
" 24"
-> 24
)NaN
" 42answer"
-> 42
)ExponentPart
由 标准 中定义的 ExponentIndicator
和 SignedInteger
组成)被忽略 - 一旦遇到 e
字符,解析就会停止并返回已解析的数字。事实上,它甚至会在更早的时候停止 - 当第一个小数点被发现时(参见最后一条规则)。
parseFloat()
与 parseInt
完全相同,除了:
0
(因此无法解析十六进制)parseInt
,而当转换为“浮点数”时应使用 parseFloat
(请注意,它们实际上是相同的类型)。
Number()
构造函数和一元运算符 +
:true
转换为1
,将false
转换为0
对于null
:将其转换为0
(因为null
是假值)undefined
:将其转换为NaN
对于数字:保持不变+
或-
开头 -> 数字(整数)0
NaN
valueOf()
方法。如果结果是NaN
,则调用toString()
方法。在内部,对象被转换为基本类型,然后该基本类型被转换为数字。TypeError
异常对于整数,您可以使用BigInt。对于非常大的数字不是非常精确,但完美地工作,并且我发现它是最简洁和易于记忆的选项:
BigInt(1e18).toString() => '1000000000000000000'
BigInt(1e36).toString() => '1000000000000000042420637374017961984'
BigInt(Math.round(4.874915326E7)).toString() => '48749153'
对我来说,使用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'});
}
对我来说,最简单/最安全的方法如下:
export function stringifyNumber(num: number) {
const [integer, decimals] = num.toString().split(".");
if (decimals) {
return BigInt(integer).toString() + "." + BigInt(decimals).toString();
}
return BigInt(integer).toString();
}
function convertScientificToDecimal(number) {
const decimalPlaces = -Math.floor(Math.log10(Math.abs(number)));
return Number(number.toFixed(decimalPlaces));
}
const numberInScientificNotation = 3.5209577676952493e-10;
const decimalNumber = convertScientificToDecimal(numberInScientificNotation);
console.log(decimalNumber); // 0.0000000004