Double.ToString()的奇怪行为

And*_*sen 3 c# double

我试图将double值9007199254740992.0转换为字符串.

但似乎存在舍入错误(最后2个变为0):

(9007199254740992.0).ToString("#")    // Returns "9007199254740990"
(9007199254740992.0).ToString()       // Returns"9.00719925474099E+15"
Run Code Online (Sandbox Code Playgroud)

首先,我认为这个数字可能无法表示为双数.但它可以.这可以通过将其转换为long然后将其转换为字符串来看出.

((long)9007199254740991.0).ToString() // Returns "9007199254740991"
((long)9007199254740992.0).ToString() // Returns "9007199254740992"
Run Code Online (Sandbox Code Playgroud)

另外,我发现如果我使用"R"格式,它可以工作.

(9007199254740992.0).ToString("R")    // Returns "9007199254740992"
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么ToString("#")不以完整精度返回整数部分的双精度?

Tom*_*cak 5

MSDN上可以看出:

默认情况下,返回值仅包含15位精度,但内部最多保留17位数.如果此实例的值大于15位,ToString将返回PositiveInfinitySymbol或NegativeInfinitySymbol而不是预期的数字.如果您需要更高的精度,请指定格式为"G17"格式规范,它始终返回17位精度,或"R",如果数字可以用该精度表示,则返回15位数,如果数字只能表示,则返回17位数以最大精度表示.