为什么ToString()舍入我的双重值?

时间:2010-01-20 21:27:06

标签: .net rounding tostring

如何在转换为字符串时阻止我的double值被舍入?我尝试了Convert.ToStringToString()两个相同的结果。

例如,我的double可能看起来像77.987654321,两个字符串转换转换为77.98765。我需要保持值的精确度。

5 个答案:

答案 0 :(得分:24)

默认情况下,.ToString() Double方法返回15位精度。如果你想要内部双值保存的完整17位数,你需要将“G17”格式说明符传递给方法。

String s = value.ToString("G17");

来自MSDN docs

  

默认情况下,仅返回值   包含15位精度   虽然最多17位数   内部维护。如果值   此实例大于15   数字,ToString返回   PositiveInfinitySymbol或   NegativeInfinitySymbol而不是   预期数量。如果您需要更多   精度,指定格式   “G17”格式规范,其中   总是返回17位精度,   或“R”,如果是,则返回15位数   数字可以用它表示   精度或17位数字   只能用最大值表示   精度。

答案 1 :(得分:14)

尝试类似

的内容
myDouble.ToString("R")

另见The Round-trip ("R") Format Specifier

  

往返(“R”)格式说明符保证转换为字符串的数值将被解析回相同的数值。

答案 2 :(得分:5)

Jon Skeet的DoubleConverter类有一个ToExactString()方法,它会将double的确切值作为字符串返回。

http://www.yoda.arachsys.com/csharp/DoubleConverter.cs

答案 3 :(得分:2)

我认为将最后两位数字舍入的主要答案是隐藏由于浮点/双精度有限精度导致的数值不稳定/舍入。

没有舍入的示例:

(Math.Sqrt(7)).ToString("G17") = "2.6457513110645907"

(Math.Sqrt(7)+6).ToString("G17") = "8.6457513110645898"

在最后3位数看起来有点奇怪,对吧?

舍入示例:

(Math.Sqrt(7)).ToString() = "2.64575131106459"

(Math.Sqrt(7)+6).ToString() = "8.64575131106459"

看起来“完美”,对吗?

: - )

答案 4 :(得分:0)

无保证,但请尝试ToString(“R”)。