博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java之戳中痛点 - (6)避免类型自动转换,例如两个整数相除得浮点数遇坑
阅读量:7060 次
发布时间:2019-06-28

本文共 1468 字,大约阅读时间需要 4 分钟。

先来看一个例子:

package com.test;public class calculate {    /**     * 光速30万公里/秒     */    public static final int LIGHT_SPEED = 30 * 10000 * 1000;         public static void main(String[] args) {        System.out.println("月光照射到地球的时间为1秒,计算地球距离月球的距离");        int month2earth = LIGHT_SPEED * 1;        System.out.println("地球距离月球的距离:"+month2earth);                System.out.println("阳光照射到地球的时间为8分钟,计算地球距离太阳的距离");        //可能要超出int范围,这里用long处理        long sun2earth = LIGHT_SPEED * 8 * 60;        System.out.println("地球距离太阳的距离:"+sun2earth);    }}

 结果:

 

这里发现问题没?在上面已经做了 "可能要超出int范围,这里用long处理" 的处理,地球距离太阳的距离怎么是负的?

这里要讲一个java处理运算的一个逻辑:先运算在进行类型转换

下面再来分析一下上面的问题:LIGHT_SPEED * 8 * 60 中的三个数字类型都为int,计算出来的结果为int,这时已经超出了int的范围,按溢出处理,这时再转化为long,自然就是这个结果了;

若改成 LIGHT_SPEED * 8L * 60 就没问题了;

8L是一个long类型,乘出来的结果也是long型(这里用到了java基础类型的转化规则,自动向数据范围大的方向转换:byte→short(char)→int→long→float→double),最后的结果就是long型,就不存在int溢出的问题了;

但是在实际开发中,并不是这样写的, 而是改写成:1L * LIGHT_SPEED * 8 * 60 , 因为本来期望的就是long型结果,何不直接说我就是long型,简单明了;

 

再来看一种场景:

package com.test;public class calculate {    public static void main(String[] args) {        int a = 5;        int b = 2;        float f = a / b;        System.out.println(f);    }}

 结果:

嗯?结果不应该是2.5吗?怎么是2.0?  说到这里一把辛酸泪,我就踩过这个坑

看看第一个例子的结论,是不是就明白了;

纠正: 1.0f * a / b  就可以了 结果2.5; 但是一定要注意千万不要写成 a / b * 1.0f ,要不肯定又错了,切记!!!所以最理想的解决方式,要在算式最前边加上主动声明;

 

PS:java处理运算的一个逻辑:先运算在进行类型转换  ;再有预期的情况下,一定先转换类型,免得出错;

结论:基础类型转换时,一定要主动声明,避免不必要的BUG

 

转载于:https://www.cnblogs.com/JsonShare/p/7003278.html

你可能感兴趣的文章
Linux 命令快捷键
查看>>
构建一个用于产品介绍的WEB应用
查看>>
深入浅出WPF 第一部分(3)
查看>>
StringTokenizer类的使用
查看>>
Java并发框架??AQS中断的支持
查看>>
11g RAC R2 体系结构---Grid
查看>>
sql server 2005 外围应用配置器
查看>>
[MODx] 9. Real Example
查看>>
健康饮食
查看>>
Visual Studio 2015年预览设置: 辅助安装程序说明
查看>>
(转)在NGUI使用图片文字(数字、美术字)(直接可用于UILable)
查看>>
javascript动态创建script标签,加载完成后调用回调
查看>>
Linq 实现两个对象实例List之间的赋值
查看>>
Bézier curve
查看>>
七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC
查看>>
中国目前拥有的物种和人造卫星的作用
查看>>
7 Tools for Data Visualization in R, Python, and Julia
查看>>
【转】ubuntu apt-get update 失败解决
查看>>
ubuntu12.04 安装CS:APP Y86模拟器
查看>>
[LeetCode] Majority Element II 求众数之二
查看>>