doublevalue.ToString()在C#中丢失小数位

时间:2016-02-24 06:57:12

标签: c# c#-4.0

double值的ToString()导致丢失小数位

(1521.6666666666667).ToString()   ==>  "1521.66666666667"

转换为字符串时有没有办法保存所有小数位

另外

(1521.6666666666667).ToString("F13");   => "1521.6666666666700"
(1521.6666666666667).ToString("0.0000000000000");   => "1521.6666666666700

这是否与双值

的大小有关

5 个答案:

答案 0 :(得分:4)

解决方法是阅读文档。说真的不是" ToString"那就是失去它。

让我引用https://msdn.microsoft.com/en-us/library/b1e65aza.aspx中的浮点数据类型:

精确度:7位数。

这些数字在你的来源中,它们永远不会浮动。不正确。该值是四舍五入的。

答案 1 :(得分:2)

fn filter<F>(self, f: F) -> Option<T> where F: for<'a> FnOnce(&'a T) -> bool

根据documentation

  

与浮点类型相比,十进制类型具有更高的精度和更小的范围。

具体来说,f有28-29位有效数字,而不是&value为15-16。

答案 2 :(得分:1)

你必须格式化字符串。

(1521.6666666666667).ToString("R");

答案 3 :(得分:1)

您可以使用Decimal代替Double

  (1521.6666666666667M).ToString(); // note "M"

另一种可能性(如果你必须使用Double)是&#34; R&#34;格式:

 (1521.6666666666667).ToString("R");

答案 4 :(得分:0)

使用The Round-trip ("R") Format Specifier,它将尝试确保将转换为字符串的数值解析回相同的数值。仅SingleDoubleBigInteger类型支持此格式。

对于DoubleSingle值,

,“R”格式说明符在某些情况下无法成功地往返原始值,并且性能相对较差。相反,我们建议您使用Double值的“G17”格式说明符和“G9”格式说明符来成功往返单值。

来自MSDN:

  

在某些情况下,如果使用/platform:x64/platform:anycpu开关进行编译,则使用“R”标准数字格式字符串格式化的 Double 值无法成功往返在64位系统上。

资源:Standard Numeric Format Strings