.NET的ToString()数字截断

时间:2011-01-13 16:52:30

标签: c# wpf

因此,WPF在DataGrid中生成TextColumns时调用对象上的ToString(),然后我发现了ToString()方法的奇怪之处: 看看这个:

object a = 0.3780000001;//Something like this
Console.WriteLine(a.ToString());//Gets truncated in some cases

首先,我认为它只是四舍五入,但很少有人能够重现这种行为 用<加倍点后15位数。我错过了什么吗?

9 个答案:

答案 0 :(得分:9)

对于计算机,0.378和0.378000 ... 0001是相同的数字。请参阅此问题:Why is floating point arithmetic in C# imprecise?

答案 1 :(得分:4)

使用decimal代替float来获得更精确的类型。

答案 2 :(得分:4)

根据MSDN page for System.Double的定义,double类型最多只包含十五位精度。即使它在内部保持17,你的数字包含18位有效数字;这超出了System.Double的范围。

答案 3 :(得分:3)

默认情况下,Double.ToString()在点后截断为15位,但如果您确实要使用double数据类型并且需要这2个额外数字,则可以使用“G17”格式字符串:

double x = 3.1415926535897932;

string pi = x.ToString("G17");

这将为您提供一个包含完整17位数的字符串。

答案 4 :(得分:2)

我不会假设(如此之快)您发现了一些与C#的ToString实现一样重要的错误。

您遇到的行为是由浮点数不精确地存储在计算机内存中引起的(另请参阅this question)。

答案 5 :(得分:1)

数字格式的精确度范围可能不包含该数字? (即浮动只有几个有效数字的准确性)

答案 6 :(得分:1)

如果您对数据进行数据绑定,则可以提供ValueConverter,以任意方式格式化数字。

http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

答案 7 :(得分:1)

将a设置为十进制,它将正确打印!

decimal a = 0.378000000000000001m;
    Console.WriteLine(a.ToString()); 

答案 8 :(得分:0)

您可以使用常用的十进制格式设置。

例如


 object a = 0.378000000000000001;
 Console.WriteLine(a.ToString(Settings.DecimalFormat));