Java之戳中痛点 - (6)避免类型自动转换,例如两个整数相除得浮点数遇坑
2018-08-22 23:32
627 查看
Java之戳中痛点 - (6)避免类型自动转换,例如两个整数相除得浮点数遇坑
先来看一个例子:
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
相关文章推荐
- Java之戳中痛点 - (6)避免类型自动转换,例如两个整数相除得浮点数遇坑
- JAVA springmvc自动转换日期类型的格式
- 第二十一篇 Java 数据类型的定义 ,以及基础类型的自动转换和强制转换
- java中,数值计算时的类型转换 ( 两个int类型相加,赋值给double )
- 【小知识点总结】java中两个整数相除得到小数点并保留两位小数的方法
- Java中Class类中两个值得注意的进行类型动态转换的方法
- java数值类型自动转换原则
- Java八种基本类型(byte、short、int、long、浮点数、char、boolean、基本类型转换)
- 类型转换问题(java会把byte,short和char的运算操作转换为int类型即低精度自动向高精度转换)
- Java数据类型转换(自动转换和强制转换)
- 对Java字符串与整形、浮点类型之间的相互转换方法总结
- java学习之旅10--基本数据类型自动转换_强制转型_类型提升问题
- java中两个整数相除得到小数点并保留两位小数的方法
- 79、Java 两个整数相除保留两位小数,将小数转化为百分数
- 【JAVA学习】java基本数据类型与字符串之间的转换(基本数据类型、对象封装类、自动装箱、自动拆箱)
- 牛客网Java刷题知识点之基本类型的自动转换和基本类型的强制转换
- JAVA数据类型自动转换,与强制转换
- 对java基础数据类型在运算过程中的自动转换的一些分析
- 黑马程序员—Java基础学习笔记之数据类型转换(自动转换和强制转换)
- 关于Java变量类型的自动转换