Math.Pow计算不正确

时间:2010-11-28 15:21:02

标签: c# pow

我遇到了C#的问题。准确地说Math.pow()。如果我试着计算15 ^ 14那么我得到“29192926025390624”。但如果我用Wolfram Alpha计算它,我会得到“29192926025390625”。正如您所看到的,唯一的区别是1个数字。 Wolfram Alpha是正确的。为什么不是C#?以及如何解决这个问题,以便在C#中获得正确的值?7

我的代码相当简单,因为我只是尝试使用硬编码的示例。所以我正在做的是:Math.Pow(15,14);这给了29192926025390624。而不是“29192926025390625”这是正确答案。

链接:Wolfram Alpha

6 个答案:

答案 0 :(得分:10)

Math.Pow对浮点类型进行操作,根据定义, 不准确。如果需要任意精度整数,请使用任意精度整数类型,例如BigInteger结构。 BigInteger也有Pow方法。

答案 1 :(得分:4)

Math.Pow适用于双打。 Doubles are 64 bit floating point and have about 15-16 digits of precision in C#,因此,您所看到的是一个舍入错误。这就是浮点数的工作原理。

如果您需要更高的精确度,请尝试使用decimal。它是128位并使用10作为基数。这使您可以准确表示最多28-29位有效数字。您可以轻松地为小数定义自己的Pow方法。

如果decimal不够,请转到{4},这是在.NET 4中添加的。

答案 2 :(得分:4)

Math.Pow适用于双打。这个带有long的实现得到了正确的答案:

Func<long, int, long> power = null;
power = (i, p) => p == 1 ? i : i*power(i, p - 1);
Console.WriteLine(power(15, 14));

答案 3 :(得分:1)

Math.Pow()正在解决双数据类型的问题   看到这一点。

        double i = 29192926025390625;
        Console.WriteLine("{0}",i);//the result will be 29192926025390624.0

哎呀抱歉,通过断点检查值;在你的程序中;

答案 4 :(得分:0)

C#的Math.pow返回一个Double,一个IEEE 754标准浮点数。它只有15位有效数字:

http://msdn.microsoft.com/en-us/library/system.math.pow.aspx http://math.byu.edu/~schow/work/IEEEFloatingPoint.htm

答案 5 :(得分:-1)