double类型赋值给long类型变量报错

double类型赋值给long类型变量报错

图片描述
老师,double和long类型同样都占用8个字节,为什么将long var = 1.9e8;赋值给long类型变量就会报错?写成long var = 1.9e8l;也会报错,为什么只有将它强制转换long var = (long)1.9e8;才可以?下面一句将long类型的var赋值给double类型就不会报错了呢?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好~

1.long类型最大存储数据量是2的64次方,可以表示-2的63次方到2的63次方-1之间的数,而double可以表示大约-1.79E+308到-1.79E+308之间的数。可见两者不止是数据,而是数量级上都存在着巨大的差距,double可以存储的数据范围远大于long类型;

2.在Java中,存储数据时不仅是其所消耗的内存大小,还需要看其存储的方式。整数类型的数据都是直接将数据转化为二进制进行表示的,但是浮点型在存储时,不仅有表示精度的直译二进制,还有表示位数的次方数等等,其存储方式决定了,同样使用8字节,浮点数可以存储的数据范围相当巨大;

3.由于1.9e8这个数据本身已经超过long可以表示的数据范围,所以无论是否使用符号“L”,都无法转化为long类型数据,只能使用强制类型转换来进行数据的截取;

4.由于上面所说,long类型所能表达的数据范围远远小于double能够存储的范围,那么无论是什么样的long类型数据,一定会被double所涵盖,所以任何long类型数据都可以直接存储在double类型变量中,而无需进行任何标记或者转换。

祝学习愉快~

  • 慕勒8540250 提问者 #1

    老师,既然1.9e8已经超出了long可以表示的数据范围,我们再进行强制类型转换为long,为什么打印输出的数的精度没有损失,依旧是190000000?

    2024-05-10 09:57:48
  • 好帮手慕小蓝 回复 提问者 慕勒8540250 #2

    同学你好,实际上是有损失的,虽然在代码中明确写的是1.9e8,在我们的理解中就是190000000,但是在Java存储时却不是这样,实际存储的是,一个接近190000000的,带有小数位的浮点数。而在强制类型转换之后,根据转化时要截取小数位,只保留整数位,表现的就是190000000了。

    举个例子,虽然和实际存储的数据可能有出入,但是原理可以这么理解,比如1.9e8这个数据,在存储时,可能是190000000.000000111,然后被截取小数位,同学发现,就是190000000,但是显然的,和1.9e8实际的190000000.000000111,是产生了精度损失的,只不过这个损失,在程序上,或者在控制台输出上,是体现不出来的,只能体现在内存中数据处理的过程中。

    祝学习愉快~

    2024-05-10 11:07:10
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
计算机基础课
  • 参与学习       233    人
  • 解答问题       159    个

1000位程序员+大厂HR联袂推荐,面向所有程序员的计算机核心知识体系,优惠中~

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师