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

use*_*757 19 .net tostring rounding

如何在转换为字符串时防止我的double值被舍入?我试过两个Convert.ToString并且ToString()得到了相同的结果.

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

Sim*_*ens 24

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

String s = value.ToString("G17");
Run Code Online (Sandbox Code Playgroud)

来自MSDN文档:

默认情况下,返回值仅包含15位精度,但内部最多保留17位数.如果此实例的值大于15位,ToString将返回PositiveInfinitySymbol或NegativeInfinitySymbol而不是预期的数字.如果您需要更高的精度,请指定格式为"G17"格式规范,它始终返回17位精度,或"R",如果数字可以用该精度表示,则返回15位数,如果数字只能表示,则返回17位数以最大精度表示.

  • @Robert:因为你几乎不需要它们.15位数足以几乎总能恢复正确的数字,这也意味着舍入通常可以正确地缩短数字.做得比这更好,但是执行它的代码要复杂得多,而且语言/库很少.(Tcl之所以这就是为什么我比大多数人更了解这一点...) (2认同)

Tho*_*mas 14

尝试类似的东西

myDouble.ToString("R")
Run Code Online (Sandbox Code Playgroud)

另请参见往返("R")格式说明符:

往返("R")格式说明保证被转换成字符串的数值将被解析回到相同的数值.


Rob*_*vey 5

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

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