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之戳中痛点 - (4)i++ 和 ++i 探究原理
先看一个例子: package com.test; public class AutoIncrement { public static void main(String[] args) { int ...
- Java之戳中痛点 - (3)三目运算符的两个操作数类型尽量一致
先看一个例子: package com.test; public class TernaryOperator { public static void main(String[] args) { in ...
- Java之戳中痛点 - (7)善用Java整型缓存池
先看一段代码: package com.test; import java.util.Scanner; public class IntegerCache { public static void m ...
- Java之戳中痛点 - (1)易变业务使用脚本语言编写
脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型:2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务3.简单:脚本语言语法比 ...
- Java之戳中痛点 - (8)synchronized深度解析
概览: 简介:作用.地位.不控制并发的影响 用法:对象锁和类锁 多线程访问同步方法的7种情况 性质:可重入.不可中断 原理:加解锁原理.可重入原理.可见性原理 缺陷:效率低.不够灵活.无法预判是否成功 ...
- Java之戳中痛点 - (5)switch语句break不能忘以及default不同位置的用法
先看一段代码: public class Test{ public static void main(String[] args){ System.)); } } public static Stri ...
- Java之戳中痛点 - (2)取余用偶判断,不要用奇判断
取余判断原则:取余用偶判断,不要用奇判断 先看一个 程序: package com.test; import java.util.Scanner; public class t1 { public s ...
- [ios][swift]swift中如果做基本类型的转换
在swift中如果做基本类型的转换的?比如Int -> Float(Double)Double -> 保留两位小数String -> IntDouble -> String 有 ...
- java基本类型自动转换
具体自动提升类型如上图所示.其中long->float的转换一开始让我感觉有点问题,因为long是64位的,而float却是32位的. 遂找寻答案,参考博客java中long到float的自动转 ...
随机推荐
- python 读取Excel(二)之xlwt
今天由于在接口测试报告中感觉自己写的接口测试报告特别low,Excel的连个颜色都不加,就想着怎么去想办法给整整,自己根据API一次次调试,感觉很慢,于是乎,百度,可惜没有找到,去官网,官网给的也特别 ...
- cpp(第十四章)
1.类的静态成员变量.静态常整型(static const int)变量可以直接在类声明中初始化,静态常变量(static const )需要在类定义文件中初始化, 常变量(const )则在构造函数 ...
- Java 9 揭秘(4. 模块依赖)
文 by / 林本托 Tips 做一个终身学习的人. 在此章节中,主要学习以下内容: 如何声明模块依赖 模块的隐式可读性意味着什么以及如何声明它 限定导出(exports)与非限定导出之间的差异 声明 ...
- Spring学习(1)----入门学习(附spring-framework下载地址)
(一)Spring是什么 Spring是一个开源框架,为了解决企业应用开发的复杂性而创建的,但现在已经不止应用于企业应用 是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架- 从大小和开销 ...
- 每天一个JS 小demo之树菜单。主要知识点:DOM方法综合运用,递归运用
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...
- [项目记录]一个.net下使用HAP实现的吉大校园通知网爬虫工具:OAWebScraping
第一章 简介 本文主要介绍了在.NET下利用优秀的HTML解析组件HtmlAgilityPack开发的一个吉林大学校内通知oa.jlu.edu.cn的爬取器.尽管.Net下解析HTML文件有很多种选择 ...
- 简谈java 中的 继承和多态
继承(extends) : 1:object 是所有类的父(基)类. 2:子类继承父类所有的内容除了(private修饰的和构造方法). 3:子类在手动创建构造方法时,必须调用父类构造方法. 4:在J ...
- PHP提取字符串中的所有汉字
<?php $str = 'aiezu.com 爱E族, baidu.com 百度'; preg_match_all("#[\x{4e00}-\x{9fa5}]#u", $s ...
- 使用dns批量管理普通主机名相关问题
1.dns配置 日常管理主机过程中,会有很多地方需要使用到主机名的,当主机非常多的时候,就不适合使用hosts来管理和同步的所有主机hosts了,这个时候就可以使用dns来管理主机名映射和变动 dns ...
- VS2012打开项目 提示Asp.net4.5未在web服务器上注册
在用vs2012代开项目时,没回都显示Asp.net4.5未在web服务器上注册,最后是由于没有下载一个补丁的原因,只需要下载安装补丁 VS11-KB3002339.exe ,下载地址:https:/ ...