C# Double.ToString()的奇怪行为

C# Double.ToString()的奇怪行为,c#,double,C#,Double,我正在尝试将双精度值9007199254740992.0转换为字符串 ((long)9007199254740991.0).ToString() // Returns "9007199254740991" ((long)9007199254740992.0).ToString() // Returns "9007199254740992" 但似乎存在舍入误差(最后2个变为0): 首先我想也许这个数字不能表示为双精度。但它可以。这可以通过将其转换为长字符串,然后将其转换为字符串来看到 ((lon

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

((long)9007199254740991.0).ToString() // Returns "9007199254740991"
((long)9007199254740992.0).ToString() // Returns "9007199254740992"
但似乎存在舍入误差(最后2个变为0):

首先我想也许这个数字不能表示为双精度。但它可以。这可以通过将其转换为长字符串,然后将其转换为字符串来看到

((long)9007199254740991.0).ToString() // Returns "9007199254740991"
((long)9007199254740992.0).ToString() // Returns "9007199254740992"
而且,我发现如果我使用了,它会工作

(9007199254740992.0).ToString("R")    // Returns "9007199254740992"
谁能解释一下为什么
ToString(#”)不返回整数部分为全精度的double吗?

如下所示:

默认情况下,返回值仅包含15位精度 尽管内部最多保留17位数字。如果值 此实例的值大于15位,ToString返回 正整数SYMBOL或负整数SYMBOL而不是 预期数量。如果需要更高的精度,请使用指定格式 “G17”格式规范,始终返回17位 精度,或“R”,如果可以输入数字,则返回15位数字 用该精度表示,如果数字只能为 以最大精度表示


有趣。所以,如果你想把一个double转换成一个字符串,而你不知道它有多少位精度,你应该总是使用“R”或“G17”(如果精度对你很重要的话)。这当然可能是一个陷阱——我花了相当长的时间来找出代码失败的原因。谢谢您的回复。:)@安德斯凯勒卡斯滕森。另请参见中的另一个问题。这是故意的。它们折叠所有不同的
double
值,这些值的字符串表示形式与
“G15”
格式相同。这就失去了精确性。