双精度

时间:2009-05-16 20:08:09

标签: c# double precision

我有一个代码,我不明白。我正在开发一个精度非常重要的应用程序。但它对.NET来说并不重要,为什么呢?我不知道。

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

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

5 个答案:

答案 0 :(得分:2)

Double的精度为15位(内部17位)。您使用Math.Pow计算的值是正确的,但是当您将其添加到value时,它只是太小而无法发挥作用。

编辑:
Decimal可以处理该精度,但不能计算。如果您想要这种精度,则需要进行计算,然后将每个值转换为Decimal,然后再将它们组合在一起:

double value = 3.5;
double small = Math.Pow(10, -20);

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

MessageBox.Show(result.ToString());

答案 1 :(得分:2)

如果您正在做任何精度非常重要的事情,您需要了解浮点的限制。一个很好的参考是David Goldberg's "What Every Computer Scientist Should Know About Floating-Point Arithmetic"

您可能会发现浮点数不足以提供足够的精度,您需要使用十进制类型。然而,这些总是比浮点慢得多 - 它是准确性和速度之间的权衡。

答案 2 :(得分:1)

或使用Decimal类型而非双倍。

答案 3 :(得分:1)

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

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);

你会得到

 a  = 1E-20
1+a = 1
 b  = 0,00000000000000000001
1+b = 1,00000000000000000001

但请注意,Pow函数与Math类中的几乎所有函数一样,只需要双精度:

double Pow(double x, double y);

所以你不能取小数的正弦值(除了将其转换为加倍)

另见this question

答案 4 :(得分:0)

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