Double x = 11.123456789123456;
string y = Convert.ToString(x);
//gives y=11.1234567891235
//y should be =11.123456789123456
从上面的代码如何防止最后一个数字(6)被截断
Double x = 11.123456789123456;
string y = Convert.ToString(x);
//gives y=11.1234567891235
//y should be =11.123456789123456
从上面的代码如何防止最后一个数字(6)被截断
利用
string y = x.ToString("G17");
或者
string y = x.ToString("R");
如此处所写:
默认情况下,返回值仅包含 15 位精度,尽管内部维护最多 17 位。如果此实例的值大于 15 位,则 ToString 返回 PositiveInfinitySymbol 或 NegativeInfinitySymbol 而不是预期的数字。如果您需要更高的精度,请使用“G17”格式规范指定格式,它始终返回 17 位精度,或“R”,如果数字可以用该精度表示,则返回 15 位数字,如果数字只能表示,则返回 17 位数字以最高精度表示。
请注意,并非所有数字都可以准确表示...
11.123456789123458.ToString("G17") == "11.123456789123457"
发生这种情况的原因是因为 Double 占用 8 个字节并且精度为 15-16 位。改用十进制
Decimal x = 11.123456789123456M;
string y = Convert.ToString(x);
//gives y=11.12345678912356
请参阅此链接,寻找 cds333 的答案