因此,WPF在DataGrid中生成TextColumns时调用对象上的ToString(),然后我发现了ToString()方法的奇怪之处: 看看这个:
object a = 0.3780000001;//Something like this
Console.WriteLine(a.ToString());//Gets truncated in some cases
首先,我认为它只是四舍五入,但很少有人能够重现这种行为 用<加倍点后15位数。我错过了什么吗?
答案 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));