先来看一个例子:

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)避免类型自动转换,例如两个整数相除得浮点数遇坑的更多相关文章

  1. Java之戳中痛点 - (4)i++ 和 ++i 探究原理

    先看一个例子: package com.test; public class AutoIncrement { public static void main(String[] args) { int ...

  2. Java之戳中痛点 - (3)三目运算符的两个操作数类型尽量一致

    先看一个例子: package com.test; public class TernaryOperator { public static void main(String[] args) { in ...

  3. Java之戳中痛点 - (7)善用Java整型缓存池

    先看一段代码: package com.test; import java.util.Scanner; public class IntegerCache { public static void m ...

  4. Java之戳中痛点 - (1)易变业务使用脚本语言编写

    脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型:2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务3.简单:脚本语言语法比 ...

  5. Java之戳中痛点 - (8)synchronized深度解析

    概览: 简介:作用.地位.不控制并发的影响 用法:对象锁和类锁 多线程访问同步方法的7种情况 性质:可重入.不可中断 原理:加解锁原理.可重入原理.可见性原理 缺陷:效率低.不够灵活.无法预判是否成功 ...

  6. Java之戳中痛点 - (5)switch语句break不能忘以及default不同位置的用法

    先看一段代码: public class Test{ public static void main(String[] args){ System.)); } } public static Stri ...

  7. Java之戳中痛点 - (2)取余用偶判断,不要用奇判断

    取余判断原则:取余用偶判断,不要用奇判断 先看一个 程序: package com.test; import java.util.Scanner; public class t1 { public s ...

  8. [ios][swift]swift中如果做基本类型的转换

    在swift中如果做基本类型的转换的?比如Int -> Float(Double)Double -> 保留两位小数String -> IntDouble -> String 有 ...

  9. java基本类型自动转换

    具体自动提升类型如上图所示.其中long->float的转换一开始让我感觉有点问题,因为long是64位的,而float却是32位的. 遂找寻答案,参考博客java中long到float的自动转 ...

随机推荐

  1. 产品经理必备工具-Axure(1)

    资源下载: Axure的中文官方下载地址:https://www.axure.com.cn/3510/ Axure汉化包:https://www.axure.com.cn/2616/ Axure元件库 ...

  2. Vulkan Tutorial 16 Command buffers

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 诸如绘制和内存操作相关命令,在Vulkan中不是通过函数直接调用的.我们需要在命令缓 ...

  3. R语言统计分析技术研究——卡方检验的思想和实现

    卡方检验的思想和实现 作者:李雪丽 材料摘自:百度

  4. Windows 10环境安装VIM代码补全插件YouCompleteMe

    Windows 10环境安装VIM代码补全插件YouCompleteMe 折腾一周也没搞定Windows下安装VIM代码补全插件YouCompleteMe,今天在家折腾一天总算搞定了.关键问题是在于P ...

  5. 我的学习之路_第二十章_JDBC

    JDBC 使用JDBC技术,通过mysql提供的驱动程序,操作数据库 ● 1. 注册驱动 告知jvm 使用的是什么驱动程序(mysql,oracle) 使用API中的类 DriverManager中的 ...

  6. linux服务器查看redis版本:

    linux服务器查看redis版本:redis-server-v

  7. ASP.NET Core 源码学习之 Options[4]:IOptionsMonitor

    前面我们讲到 IOptions 和 IOptionsSnapshot,他们两个最大的区别便是前者注册的是单例模式,后者注册的是 Scope 模式.而 IOptionsMonitor 则要求配置源必须是 ...

  8. 【原】无脑操作:eclipse + maven搭建SSM框架

    网上看到一些Spring + Spring MVC + MyBatis框架的搭建教程,不是很详细或是时间久远了,自己动手整一个简单无脑的! 0.系统环境 1)Windows 10 企业版 2)JDK ...

  9. bootstrap-datepicker的bug:有日期输入的地方在下个月页面选择当天日期会以当天日期减少一个月显示

    Bug复现详细描述:先选择今日日期,然后点击下个月的某个日期,注意,是直接点击下个月的某个日期,不能通过日期显示tab的下个月箭头进入下个月再来点击某个日期,然后再直接点击本月的今日日期.然后bug会 ...

  10. maven配置本地仓库(从本地仓库下载jar包到.m2仓库)

     Windows-->preference               把你的settings.xml存到一个地方maven指向你的settings.xmlsettings.xml里的地址是你们 ...