我遇到了C#的问题。准确地说Math.pow()。如果我试着计算15 ^ 14那么我得到“29192926025390624”。但如果我用Wolfram Alpha计算它,我会得到“29192926025390625”。正如您所看到的,唯一的区别是1个数字。 Wolfram Alpha是正确的。为什么不是C#?以及如何解决这个问题,以便在C#中获得正确的值?7
我的代码相当简单,因为我只是尝试使用硬编码的示例。所以我正在做的是:Math.Pow(15,14);
这给了29192926025390624
。而不是“29192926025390625”这是正确答案。
答案 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)