通过运行与在.NET中double乘法是否有问题?相关的快速实验并阅读一些关于C#字符串格式化的文章,我认为以下内容:
{
double i = 10 * 0.69;
Console.WriteLine(i);
Console.WriteLine(String.Format(" {0:F20}", i));
Console.WriteLine(String.Format("+ {0:F20}", 6.9 - i));
Console.WriteLine(String.Format("= {0:F20}", 6.9));
}
这段C代码的C#等效代码是什么:
{
double i = 10 * 0.69;
printf ( "%f\n", i );
printf ( " %.20f\n", i );
printf ( "+ %.20f\n", 6.9 - i );
printf ( "= %.20f\n", 6.9 );
}
然而,C#生成的输出是:
6.9
6.90000000000000000000
+ 0.00000000000000088818
= 6.90000000000000000000
尽管在调试器中显示为与值6.9相等的值6.89999999999999946709(而不是6.9)。
与 C 相比,它显示了所需格式要求的精度:
6.900000
6.89999999999999946709
+ 0.00000000000000088818
= 6.90000000000000035527
发生了什么事?
( Microsoft .NET Framework Version 3.51 SP1 / Visual Studio C# 2008 Express Edition )
我有数值计算背景并有实现区间算法的经验——一种用于估计复杂数值系统中由精度限制引起的误差的技术。为了获得悬赏,不要试图解释存储精度——在这种情况下,它只是一个64位双精度浮点数的一个ULP之差。
为了获得悬赏,我想知道.Net是否可以将double格式化到C代码中所需的精度。