java中整数除以浮点_Java之戳中痛点 - (6)避免类型自动转换,例如两个整数相除得浮点数遇坑...

先来看一个例子:

packagecom.test;public classcalculate {/*** 光速30万公里/秒*/

public static final int LIGHT_SPEED = 30 * 10000 * 1000;public static voidmain(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);

}

}

结果:

234e2498c02e349cf8a493a95a5c877f.png

这里发现问题没?在上面已经做了 "可能要超出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型,简单明了;

再来看一种场景:

packagecom.test;public classcalculate {public static voidmain(String[] args) {int a = 5;int b = 2;float f = a /b;

System.out.println(f);

}

}

结果:

c86e29ca61934a3455b07f55aa4d532d.png

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值