A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐兴旺 中级黑马   /  2012-3-1 00:32  /  5266 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


为什么使用long声明和double声明得到的结果不一样呢?
对比程序如下:
public class P376{
public static void main(String[] atgs){
     long sum1=0,n1=1;   //此处采用long声明;
        for (int i=1;i <=20;i++) {
              n1*=i;
              sum1+=n1;
        }
        System.out.println("1!+2!+3!+4!+5!....+20!="+sum1);
//-------------------------------------------------------------  
  double sum2=0,n2=1;  //此处采用double声明;
        for (int i=1;i <=20;i++) {
              n2*=i;
              sum2+=n2;
        }
        System.out.println("1!+2!+3!+4!+5!....+20!="+sum2);
  }
  }



结果为:
1!+2!+3!+4!+5!....+20!=2561327494111820313
1!+2!+3!+4!+5!....+20!=2.5613274941118203E18

本来double型比 long型的精度还要高,为什么double型最后两位“13”就没有了呢?  不是比long型的精度还要低了嘛?
请问是不是double使用科学计数法只精确到小数点后16位显示?实际上结果是没有误差的?
使用float只显示小数点后8位呢?

4 个回复

倒序浏览
这个其实就只是因为double的双精度只能取到小数点后的16位,而long整形的最大值是9223372036854775807,这样相信你可以很容易理解吧!你把那么大的数值转换成小数,这相当于丢失精度而已。后面的,就像  int a=4567,b;b=a*1000/1000;结果是4000一样的道理。
回复 使用道具 举报
我是这样理解的,不知道对不对。我认为整数没有精度一说,把一个整数赋给long,只要不超过9223372036854775807,其值和实际值是完全相等的。只有小数,才有精度一说。把
1.1111111111111111111111111111111111 赋给double,得到的值与实际的值不一样。就假如整数有精度,那么long的精度也比double高,因为long与double在内存中都是64位,long的存储结构应该是1个符号位,63个数值位;double的存储结构中不光有符号位,还有专门存阶码的(决定取值范围),决定精度的尾数部分肯定比63小。所以long的有效位更多。在相同的位数下,精度和取值范围是一对矛盾体,精度越大(尾数部分占的位数多),取值范围就小(阶码占的位数少),反而推知。都是64位,double的取值范围(约1.798E308)比long大的多,所以long的精度更大。可以把long看成阶码部分为0这样的特殊情况。
回复 使用道具 举报
double在计算机上小数点只能显示16位数字啊
回复 使用道具 举报
本帖最后由 舞动的心弦 于 2012-3-2 20:00 编辑

额,看了你的问题
论范围,double要大得多
但是论精度,long要比double大
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马