Double.ToString()的奇怪行为

时间:2014-04-13 08:48:05

标签: c# double

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

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

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

首先,我认为这个数字可能不会被表示为双数。但它可以。通过将其转换为long然后将其转换为字符串可以看出这一点。

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

另外,我发现如果我使用"R" format,它就可以了。

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

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

1 个答案:

答案 0 :(得分:6)

可以在MSDN上看到:

  

默认情况下,返回值仅包含15位精度   虽然内部最多保留17位数字。如果值   此实例的大小超过15位,ToString返回   PositiveInfinitySymbol或NegativeInfinitySymbol而不是   预期数量。如果需要更高的精度,请指定格式   " G17"格式规范,总是返回17位数   精度,或" R",如果数字可以返回15位数   以精度表示,如果数字只能是17位数   用最大精度表示。