Double Precision
我有一个代码,我不理解它。我正在开发一个精度非常重要的应用程序。但是它对.NET不重要,为什么?我不知道。
1 2 | double value = 3.5; MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString()); |
但信息框显示:3.5请帮帮我,谢谢。
如果你做的任何事情精度非常重要,你需要意识到浮点的局限性。一个很好的参考是大卫戈德伯格的"每一个计算机科学家都应该知道的浮点运算"。
您可能会发现浮点值不能提供足够的精度,因此需要使用十进制类型。然而,这些总是比浮点慢得多——这是精度和速度之间的权衡。
编辑:小数可以处理这个精度,但不能处理计算。如果需要该精度,则需要进行计算,然后将每个值转换为
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 |
但是请注意,
1 | double Pow(double x, double y); |
所以你不能取一个十进制的正弦值(除了把它转换成double以外)
另请参阅此问题。
或者使用十进制类型而不是double。
双精度意味着它可以容纳15-16位数字。3.5+1e-20=21位。它不能用双精度表示。您可以使用其他类型,如decimal。