1

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

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

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

4

5 回答 5

3

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

您可能会发现浮点数无法提供足够的精度,您需要使用小数类型。然而,这些总是比浮点慢得多——这是准确性和速度之间的权衡。

于 2009-05-16T21:13:29.697 回答
2

a 的精度Double为 15 位(内部为 17 位)。您计算的值Math.Pow是正确的,但是当您将它添加到value它时,它太小而无法产生影响。

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

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

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

MessageBox.Show(result.ToString());
于 2009-05-16T20:16:36.150 回答
1

或者使用Decimal类型而不是 double。

于 2009-05-16T20:15:24.780 回答
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);

所以你不能取小数的正弦(然后将其转换为双精度)

另请参阅此问题

于 2009-05-16T20:29:50.923 回答
0

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

于 2009-05-16T20:18:18.160 回答