如何在转换为字符串时阻止我的double值被舍入?我尝试了Convert.ToString
和ToString()
两个相同的结果。
例如,我的double可能看起来像77.987654321
,两个字符串转换转换为77.98765
。我需要保持值的精确度。
答案 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的确切值作为字符串返回。
答案 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”)。