我正在尝试将双值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("#")
没有以完全精度返回整数部分的双精度?
答案 0 :(得分:6)
可以在MSDN上看到:
默认情况下,返回值仅包含15位精度 虽然内部最多保留17位数字。如果值 此实例的大小超过15位,ToString返回 PositiveInfinitySymbol或NegativeInfinitySymbol而不是 预期数量。如果需要更高的精度,请指定格式 " G17"格式规范,总是返回17位数 精度,或" R",如果数字可以返回15位数 以精度表示,如果数字只能是17位数 用最大精度表示。