首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
中国IT教育
Google
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> 新手入门 >> 基础入门 >> 正文

java学习之数值型别(int,float,double等)

    1. 代码

2.Java中数字类型的转换法则

    test1中看似除数中的所有的因子都被约掉了,只剩下了1000。但实际的输出却是5,而不是我们期望的1000。究其原因,是因为MICROS_PER_DAY按int类型进行的计算,而计算的结果是86400000000,已经超出了int类型的最大值,即溢出了(因int为32位,2^31-1=2147483647),24*60*60*1000*1000最后的结果是500654080(见程序中的print1的输出)。

 

    在产生了错误的计算结果后,该结果被付给了long型的MICROS_PER_DAY,long型为64位,故保持了这个错误的结果,最终导致了最终结果的错误。

 

    解决该问题的方法是,通过使用long常量来代替int常量作为每一个乘积的第一个因子,这样就可以强制表达式中所有的后续计算都使用long运算来完成,这样就不会丢失精度,即:

    long MICROS_PER_DAY = 24L*60*60*1000*1000;


    图中的六个实箭头表示了无信息损失的转换,而三个虚箭头表示的转换则可能丢失精度。

 

    3.浮点类型float, double的数据不适合在不容许舍入误差的金融计算领域。

    例如上面的test2,我们预期的得到的结果是0.1,但实际的输出却是0.8999999999999999。

 

    这种误差产生的原因是因为浮点数实际上是用二进制系统表示的。而分数1/10在二进制系统中没有精确的表示,其道理就如同在十进制系统中无法精确表示1/3一样。看完下面的第4点就可以明白其中的原因了。

 

    如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。

 

    4.既然说到了浮点型是使用二进制表示的,那么就再来复习以下这方面的内容。

 

[1] [2] [3] [4] 下一页

【责编:landy】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航