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”
格式相同。这就失去了精确性。