Double.ToString()的怪异行为

本文关键字:ToString Double | 更新日期: 2023-09-27 17:58:09

我正在尝试将双值9007199254740992.0转换为字符串。

但似乎有一个舍入误差(最后2变成0):

(9007199254740992.0).ToString("#")    // Returns "9007199254740990"
(9007199254740992.0).ToString()       // Returns"9.00719925474099E+15"

起初我想,也许这个数字不能用双来表示。但它可以。这可以通过将其铸造为长形,然后将其转换为字符串来实现。

((long)9007199254740991.0).ToString() // Returns "9007199254740991"
((long)9007199254740992.0).ToString() // Returns "9007199254740992"

此外,我发现如果我使用"R"格式,它是有效的。

(9007199254740992.0).ToString("R")    // Returns "9007199254740992"

有人能解释为什么ToString("#")不以全精度返回带有整数部分的双精度吗?

Double.ToString()的怪异行为

如MSDN上所示:

默认情况下,返回值只包含15位精度尽管在内部最多保持17位数字。如果值的值超过15位,ToString返回PositiveInfinitySymbol或NegativeInitySymbol而不是预期的数字。如果需要更高的精度,请使用指定格式"G17"格式规范,它总是返回精度,或"R",如果数字可以为如果数字只能是以最大精度表示。