我有一个代码,但我不明白。我正在开发一个精度非常重要的应用程序。但它对 .NET 并不重要,为什么?我不知道。
double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());
但消息框显示:3.5 请帮帮我,谢谢。
如果您正在做任何对精度非常重要的事情,您需要了解浮点的局限性。一个很好的参考是David Goldberg 的“What Every Computer Scientist Should Know About Floating-Point Arithmetic”。
您可能会发现浮点数无法提供足够的精度,您需要使用小数类型。然而,这些总是比浮点慢得多——这是准确性和速度之间的权衡。
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());
或者使用Decimal类型而不是 double。
您可以拥有精确度,但这取决于您还想做什么。如果您将以下内容放在控制台应用程序中:
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);
所以你不能取小数的正弦(然后将其转换为双精度)
另请参阅此问题。
双精度意味着它可以容纳 15-16 位数字。3.5 + 1e-20 = 21 位数。它不能以双精度表示。您可以使用其他类型,例如十进制。