Math-pow结果不正确

use*_*317 -8 c# math floating-point

            double a1;
        a1 = Math.Pow(somehighnumber, 40);
        something.Text = Convert.ToString(xyz);
Run Code Online (Sandbox Code Playgroud)

我得到的结果是E + 41等,它像1,125123E + 41等我不明白为什么.

Eri*_*ert 11

你的问题很不清楚; 在将来,如果您使用实际编译并演示您实际遇到的问题的代码示例发布一个明确的问题,您可能会得到更好的结果.不要让人猜出问题是什么.

如果你想要做的是显示一个没有科学记数法的双精度浮点数,那么使用标准数字格式说明符:

Console.WriteLine(string.Format("{0:N}", Math.Pow(10, 100)));
Run Code Online (Sandbox Code Playgroud)

结果是:

10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00
Run Code Online (Sandbox Code Playgroud)

如果你遇到的问题是结果四舍五入,那么不要使用双精度浮点数; 它们精确到小数点后15位.尝试在具有任意整数精度的BigIntegers中进行算术运算.

  • @Yuriy:我不知道有任何这样的计划,但这并不意味着没有任何计划; 微软有很多团队致力于技术计算的各个方面,也许其中一个正在研究这样的事情.(如果技术计算编程工具的主题让您感兴趣,您可以考虑从微软研究院查看Sho;它非常灵活.) (3认同)
  • @Yuriy:当然,通过简单地创建一个包含两个BigIntegers的结构 - 一个用于尾数,一个用于指数,很容易构建自己的任意精度十进制浮点类型.让所有的数学正确并不是那么难.超高效地做这件事有点棘手. (2认同)

Mar*_*ers 7

这是科学记数法.这意味着1.125123*10 41.如果您的数字变得如此之大以至于完全显示它需要大量的屏幕空间,则科学记数法很有用.此外,浮点运算并不精确,因此即使您确实显示完全数字,大多数数字仍然是不正确的.

如果您想要精确计算,则应使用BigInteger而不是double(此类型存在于.NET 4.0或更高版本中).

  • @ user646317:这是一个正常的数字.但是,当然,如果你愿意的话,你可以自由地写出它"112512300000000000000000000000000000000000". (4认同)
  • 您可以编写一个函数,在E之后解析数字,计算小数点后的位数,删除小数,然后吐出(E之后的# - 十进制后的数字)零.但是大多数人更喜欢看科学记谱法,因为它意味着同样的事情,你不需要用零来计算数字有多大.同样地,不是写"1 googol",你*可以*写100000000000000000000 ...好吧我真的不会写100个零.但严重的是,有一个词有"十亿","googol"和科学记数法. (2认同)