我有一个代码,我不明白。我正在开发一个精度非常重要的应用程序。但它对.NET来说并不重要,为什么呢?我不知道。
double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());
但消息框显示:3.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);
所以你不能取小数的正弦值(除了将其转换为加倍)
答案 4 :(得分:0)
双精度意味着它可以容纳15-16位数字。 3.5 + 1e-20 = 21位数。它不能用双精度表示。您可以使用其他类型,如十进制。