我对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也有一个 战俘 方法。

其他提示

数学 在双打上工作。长期以来,此实施得出正确的答案:

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

数学 在双打上工作。 双打是64位浮点,在C#中具有约15-16位的精度。, ,因此,您看到的是一个舍入错误。这就是浮点数的工作方式。

如果您需要更精确,请尝试使用 小数. 。它是128位,使用10作为基础。这使您可以准确地表示高达28-29个重要数字的数字。您可以轻松地定义自己的十进制方法。

如果 decimal 还不够,转向 Biginteger, ,在.NET 4中添加。

MATH.POW()正在正确地使用双数据类型的问题 看到这个。

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

糟糕,对不起,通过断点检查值;在您的计划中;

c#的数学。点返回Double,IEEE 754标准浮点号。它只有15个重要数字:

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

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