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

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

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

有帮助吗?

解决方案

您可以精确,但它取决于你想要做什么。如果你把一个控制台应用程序如下:

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功能,像几乎所有的数学课,只需要双打:

double Pow(double x, double y);

所以,你不能把一个十进制的正弦(其他然后通过将其转换为双)

另请参见这个问题

其他提示

如果您正在做任何精度非常重要的事情,您需要了解浮点的局限性。一个很好的参考是 David Goldberg 的“每个计算机科学家都应该了解浮点运算”.

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

一个Double的精度为15位(17内部位)。你有Math.Pow计算的值是正确的,但是当你将它添加到value它只是太小,无法有所作为。

编辑:结果 一个小数点就可以搞定的精度,但不计算。如果你想要的精确度,你需要做的的计算,然后每个值相加,然后才转换为Decimal

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

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

MessageBox.Show(result.ToString());

或者使用十进制类型而不是双。

双精度意味着它可以容纳15-16位。 3.5 + 1E-20 = 21位。它不能在双precicion表示。可以使用另一种类型的像小数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top