直接乘和使用pow这两次计算结果为什么不一样

乐百川 2015-04-16 06:55:27
import java.math.BigInteger;
public class Sample{
public static void main(String []args){
f1();
f2();
f3();
f4();
}
static void f1(){
BigInteger sum=BigInteger.valueOf(0);
BigInteger factor=null;
for(int i=1;i<=15;++i){
factor=BigInteger.valueOf(1);
for(int j=0;j<i;++j){
factor=factor.multiply(BigInteger.valueOf(i));
}
sum=sum.add(factor);
}
System.out.println(sum);
}
static void f2(){
long sum=0;
long factor=0;
for(int i=1;i<=15;++i){
factor=1;
for(int j=0;j<i;++j){
factor*=i;
}
sum+=factor;
}
System.out.println(sum);
}
static void f3(){
long sum=0;
for(int i=1;i<=15;++i){
sum+=Math.pow(i,i);
}
System.out.println(sum);
}
static void f4(){
double sum=0;
for(int i=1;i<=15;++i){
sum+=Math.pow(i,i);
}
System.out.println((long)sum);
}
}
一和二结果一样,三和四结果一样,但是两者为什么不一样呢
...全文
579 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
finemi 2015-04-24
  • 打赏
  • 举报
回复
BigDecimal 可以精确运算
乐百川 2015-04-17
  • 打赏
  • 举报
回复
引用 5 楼 qq118194716 的回复:
1 5 32 288 3413 50069 873612 17650828 405071317 10405071317 295716741928 9211817190184 312086923782437 11424093749340453 449317984130199828 1 5 32 288 3413 50069 873612 17650828 405071317 10405071317 295716741928 9211817190184 312086923782437 11424093749340452 449317984130199872 -44 前面一个是准确的 后面一个是有误差的 前13次都没有误差 到第14次开始出现误差 误差的出现是在于double的出现 Math.pow(i,i)使用了double来表示 而double有效位只有15位,意思是如果 超过了15位,后面的尾巴就会被忽略掉 你这个最高到了17位,忽略掉几十很正常~
嗷嗷,非常感谢
飏飏一蝶 2015-04-16
  • 打赏
  • 举报
回复
1 5 32 288 3413 50069 873612 17650828 405071317 10405071317 295716741928 9211817190184 312086923782437 11424093749340453 449317984130199828 1 5 32 288 3413 50069 873612 17650828 405071317 10405071317 295716741928 9211817190184 312086923782437 11424093749340452 449317984130199872 -44 前面一个是准确的 后面一个是有误差的 前13次都没有误差 到第14次开始出现误差 误差的出现是在于double的出现 Math.pow(i,i)使用了double来表示 而double有效位只有15位,意思是如果 超过了15位,后面的尾巴就会被忽略掉 你这个最高到了17位,忽略掉几十很正常~
乐百川 2015-04-16
  • 打赏
  • 举报
回复
我好像没说明白,这四个函数都是求1^1+2^2+...+n^n的和的,但是我自己乘i次和直接用pow的结果却有一些误差,所以想搞清楚怎么回事,这是结果
449317984130199828
449317984130199828
449317984130199872
449317984130199872
Tony-devj 2015-04-16
  • 打赏
  • 举报
回复
首先你要弄清楚pow的含义,在来进行的对比。再将两个值打出来你就知道他们是怎么算的。
Coder_D 2015-04-16
  • 打赏
  • 举报
回复
不是代码问题,数学没过关
scmod 2015-04-16
  • 打赏
  • 举报
回复
pow好像是i的i次方 上面俩好像是阶乘

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧