先来看一个例子:

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. 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)

    javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...

  2. 限制容器对内存的使用 - 每天5分钟玩转 Docker 容器技术(27)

    一个 docker host 上会运行若干容器,每个容器都需要 CPU.内存和 IO 资源.对于 KVM,VMware 等虚拟化技术,用户可以控制分配多少 CPU.内存资源给每个虚拟机.对于容器,Do ...

  3. 仿flash轮播

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  4. java基础之IO篇

    IO流 在计算机中的流是有方向的即为IO流,分为输入流和输出流,他们的方向都是以服务的方向为主,向服务器中发送指令等等就是输出流,服务器给出的反应等等,我们都说为输出流. 字节流 字符流 输入流 In ...

  5. JAVA WEBSERVICE服务端&客户端的配置及调用(基于JDK)

    前言:我之前是从事C#开发的,因公司项目目前转战JAVA&ANDROID开发,由于对JAVA的各种不了解,遇到的也是重重困难.目前在做WEBSERVICE提供数据支持,看了网上相关大片的资料也 ...

  6. SQL Server 2012 酸爽的安装体验

    电脑上已经安装了SQL Server 2008 R2,要想安装SQL Server 2012,必须先将已安装的SQL Server 2008 R2 安全卸载,否则安装过程中会报错! 使用到的卸载软件有 ...

  7. 用removeLast和removeFrist来模仿堆和栈

    /* *在大不久前,我决定自学Java,关注了很多的公众号.微博等.没几天我看到一个笑话: *晚上孩子哭了,老婆让我去看看. *我说:"不行,咱们的床是队列,你先上的床就得你先下床... * ...

  8. [leetcode-563-Binary Tree Tilt]

    Given a binary tree, return the tilt of the whole tree.The tilt of a tree node is defined as the abs ...

  9. Example002定时打开窗口

    <!--实例002定时打开窗口--> <script> // 3秒后弹出窗口: function time() { window.open("index.html&q ...

  10. 全选与单选chekbox的自定义实现(angular框架)

    2017年7月4日,我原本可以像其他同时一样早点回家,玩几把王者荣耀,但是我没有,因为我选择留下来,写一篇博客. 项目中经常性的会遇到什么点击"全选"按钮,勾中所有"单选 ...