【问题标题】:Convert Double to String without precision loss in javascript在javascript中将Double转换为String而不会丢失精度
【发布时间】:2012-12-07 16:29:53
【问题描述】:

我想在不丢失任何精度的情况下将浮点变量转换为字符串。

即我希望字符串与我的浮点变量包含的信息相同,因为我使用输出进行进一步处理(即使这意味着字符串将非常长且可读)。

说得更清楚一点,我想有循环转换的函数

var dA = 323423.23423423e4;
var sA = toString(dA);
var dnA = toDouble(sA);

我希望 dnA 和 dA 相等

谢谢

PS:互联网上的资源通常谈论如何对字符串进行四舍五入,但我没有找到有关确切表示的信息。另外我对任意精度计算不感兴趣,我只需要双精度浮点运算。

【问题讨论】:

  • 字符串是否需要以 10 进制表示浮点值?
  • @Hogan - ECMA-262 第 4.3.19 节指定 JavaScript(更确切地说,EcmaScript)内部数字表示是 64 位 IEEE 754 值。因此,它不依赖于硬件。
  • @TedHopp - 当然可以,但您只能保证 15-17 位小数的精度,因此很容易构造一个四舍五入的字符串。
  • @Hogan - 如果往返是字符串 → 数字 → 字符串,我会同意你的看法。并非每个基数为 10 的浮点字符串在 64 位 IEEE 754 中都有精确的表示。然而,反过来是不同的:事实上,每个 IEEE 754 浮点数都有一个 exact 字符串表示因为它是 2 的有限次方的总和,每个次方都有一个以 10 为底的有限表示。所以往返 Number → String → Number 可以精确地完成。
  • @TedHopp - 是的,这个问题很棘手。由于OQ(实际上)是字符串->数字->字符串->数字。例如var dA = 123456323423.23423423e4; var sA = toString(dA); var dnA = toDouble(sA); 会有 dnA = dA,但 dA 不等于解释字符串“123456323423.23423423e4”。尽管如此,我还是删除了我原来的评论,因为你比我更正确。

标签: javascript


【解决方案1】:

让字符串算术进行字符串转换,然后使用parseFloat将其恢复为浮点数:

var dA = 323423.23423423e4;
var sA = dA + '';
var dnA = parseFloat(sA);

Here's a fiddle 看看它的实际效果。

注意:All JavaScript numbers are doubles,所以你不需要区分双精度和浮点数。因此,您唯一需要担心精度损失的地方就是您的第一行。例如,如果您在第一行中使用了var dA = 987654321.0123456789,则它将等价于var dA = 987654321.01234567,而dA 最终仍将等价于dnA

【讨论】:

  • 这是我的想法,但是我担心这种相当隐式的转换是否能保持准确性。
  • @holger:是的,它将保持dA 的准确性。但是,正如我在注释中提到的,如果您的声明包含太多数字,则此值将不如您声明的精确。
【解决方案2】:

只需 dA.toString()parseFloat(sA) 就可以了。

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 2016-06-01
    • 2023-03-18
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多