关于c#:Double Precision

Double Precision

我有一个代码,我不理解它。我正在开发一个精度非常重要的应用程序。但是它对.NET不重要,为什么?我不知道。

1
2
double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());

但信息框显示:3.5请帮帮我,谢谢。


如果你做的任何事情精度非常重要,你需要意识到浮点的局限性。一个很好的参考是大卫戈德伯格的"每一个计算机科学家都应该知道的浮点运算"。

您可能会发现浮点值不能提供足够的精度,因此需要使用十进制类型。然而,这些总是比浮点慢得多——这是精度和速度之间的权衡。


Double的精度为15位(内部为17位)。你用Math.Pow计算的值是正确的,但是当你把它加到value中时,它太小了,无法产生差异。

编辑:小数可以处理这个精度,但不能处理计算。如果需要该精度,则需要进行计算,然后将每个值转换为Decimal,然后再将它们相加:

1
2
3
4
5
6
double value = 3.5;
double small = Math.Pow(10, -20);

Decimal result = (Decimal)value + (Decimal)small;

MessageBox.Show(result.ToString());


你可以有精确性,但这取决于你还想做什么。如果将以下内容放入控制台应用程序中:

1
2
3
4
5
6
7
double a = 1e-20;
Console.WriteLine(" a  = {0}", a);
Console.WriteLine("1+a = {0}", 1+a);

decimal b = 1e-20M;
Console.WriteLine(" b  = {0}", b);
Console.WriteLine("1+b = {0}", 1+b);

你会得到

1
2
3
4
 a  = 1E-20
1+a = 1
 b  = 0,00000000000000000001
1+b = 1,00000000000000000001

但是请注意,Pow函数和数学类中的几乎所有函数一样,只需要两倍:

1
double Pow(double x, double y);

所以你不能取一个十进制的正弦值(除了把它转换成double以外)

另请参阅此问题。


或者使用十进制类型而不是double。


双精度意味着它可以容纳15-16位数字。3.5+1e-20=21位。它不能用双精度表示。您可以使用其他类型,如decimal。