Math.Pow 计算不正确

问题描述 投票:0回答:6

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

我的代码相当简单,因为我只是尝试使用硬编码的示例。所以我正在做的是:

Math.Pow(15,14);
这给出了
29192926025390624
。而不是正确答案“29192926025390625”。

链接:Wolfram Alpha

c# pow
6个回答
11
投票

Math.Pow
对浮点类型进行操作,这些类型“根据定义”是不准确的。如果您需要任意精度整数,请使用任意精度整数类型,例如 BigInteger 结构。 BigInteger 还有一个 Pow 方法。


5
投票
Math.Pow

适用于双打。这个长时间的实现得到了正确的答案: Func<long, int, long> power = null; power = (i, p) => p == 1 ? i : i*power(i, p - 1); Console.WriteLine(power(15, 14));



4
投票
Math.Pow

适用于双打。 双精度数是 64 位浮点数,在 C# 中具有大约 15-16 位精度,因此,您看到的是舍入误差。这就是浮点数的工作原理。 如果需要更高的精度,请尝试使用

decimal

。它是128位,以10为基数。这可以准确表示最多 28-29 位有效数字。您可以轻松定义自己的十进制 Pow 方法。 如果

decimal

还不够,请转向.NET 4中添加的

BigInteger


1
投票
看到这个。

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

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


1
投票

http://msdn.microsoft.com/en-us/library/system.math.pow.aspx


-2
投票
每个计算机科学家都应该了解浮点运算

© www.soinside.com 2019 - 2024. All rights reserved.