Math.Pow计算不正确

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

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

链接: Wolfram Alpha

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

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

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

Math.Pow适用于双打。 双精度是64位浮点,在C#中具有大约15-16位的精度 ,因此,您看到的是舍入误差。 这就是浮点数的工作原理。

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

如果decimal不够,请转到BigInteger ,它是在.NET 4中添加的。

Math.Pow()正确地解决了双数据类型的问题

  double i = 29192926025390625; Console.WriteLine("{0}",i);//the result will be 29192926025390624.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

每个计算机科学家应该知道的浮点运算