【java解惑】长整数计算防止溢出

如下代码:

public class Example003 {

	public static void main(String[] args) {
		final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
		final long MICROS_PER_DAY_L1 = 24 * 60 * 60 * 1000 * 1000L;
		final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
		System.out.println("NO L Print:" + MICROS_PER_DAY / MILLIS_PER_DAY); //输出1
		System.out.println("Has L Print:" +MICROS_PER_DAY_L1 / MILLIS_PER_DAY); //输出2
	}
}

输出结果:

NO L Print:5
Has L Print:1000

原因分析:

输出1和2的结果不一致的原因是计算溢出。由于MICROS_PER_DAY中所有乘起来的因子都是int,当两个int相乘时得到的结果也是int,所以MICROS_PER_DAY的计算结果是int,计算完成后(溢出)再赋值给long类型的MICROS_PER_DAY,MICROS_PER_DAY获取的是一个溢出后部分值;MICROS_PER_DAY_L1被当做一个long类型计算,计算的结果也是long,不产生溢出。所以,在操作大数字时,一定是注意溢出问题。一般在计算时,就使用long来执行。也就是在计算的因子中显式地标准数字类型。




时间: 2024-08-13 20:36:05

【java解惑】长整数计算防止溢出的相关文章

java解惑之常常忘记的事

java解惑之常常忘记的事 2012-10-17 18:38:57|  分类: JAVA |  标签:基础知识  软件开发  |举报|字号 订阅 针对刚接触java的菜鸟来说,java基础知识都是我们必须认真学习的,但是在工作过几年时间的老鸟来说,有时候也会对java的基础知识产生疑问,对于这种不确定,并且很容易混淆的知识点,java解惑已经为大家进行了很好的总结,现在借用一个作者的总结,进行一下罗列,希望能对你有所帮助. 1. 奇偶判断 不要使用 i % 2 == 1 来判断是否是奇数,因为i

《Java解惑》读书笔记

 摘选自<Java解惑>一书,之前整理了部分,一直没看完,最近为了督促自己每天读点这本书,决定一天至少更新一个谜题的内容,欢迎讨论. 欢迎关注技术博客http://blog.sina.com.cn/u/1822488043 Java解惑读书笔记 谜题1:奇数性 取余操作的定义: ( a / b ) * b + ( a % b ) = a 其中(a/b)是java运算的结果,也就是a/b是一个整数,比如3/2=1. 所以当取余操作返回一个非零结果的时候,它与左操作数具有相同符号. 请测试你的

【java解惑】java中那些反常识的小知识(续)

六.Q:请为 i!=0 && i ==-1 提供一个声明,使得其成立. 分析:在布尔表达式(i != 0 && i == -i)中,一元减号操作符作用于 i,这意味着它的类型必须是数字型的:一元减号操作符作用于一个非数字型操作数是非法的.因此,我们要寻找一个非 0 的数字型数值,它等于它自己的负值.NaN 不能满足这个属性,因为它不等于任何数值,因此,i 必须表示一个实际的数字.肯定没有任何数字满足这样的属性吗?嗯, 没有任何实数具有这种属性,但是没有任何一种 Java 数

《Java 解惑》笔记(一)

<Java 解惑>里都是一些编程时容易忽略的细节,却也蛮有意思的,所以将里面的内容稍作整理,简略地概括一下: 1.奇数性 在编程的时候经常会遇到要判断传进来的参数是否为奇数,而且容易惯性地认为判断余数是否为1即可,如下代码: public static boolean isOdd ( int i ) { return i % 2 == 1 } 这段程序在四分之一的时间里返回的都是错误的答案 因为在所有的 int 数值中,有一半都是负数,而 isOdd 方法对于对所有负奇数的判断都会失败.在任何

[Java解惑]数值表达式

数值表达式... 2 1.    奇偶判断... 2 2.    小数精确计算... 2 3.    int整数相乘溢出... 3 4.    负的十六进制与八进制字面常量... 3 5.    窄数字类型提升至宽类型时使用符号位扩展还是零扩展... 4 6.    ((byte)0x90 == 0x90)?. 5 7.    三元表达式(?:)... 5 8.    +=复合赋值问题... 6 9.    i =++i;与i=i++;的区别... 7 10.      Integer.MAX_

深入了解Java虚拟机(1)java内存区域与内存溢出异常

java内存区域与内存溢出异常 一.运行时数据区域 1.程序计数器:线程私有,用于存储当前所执行的指令位置 2.Java虚拟机栈:线程私有,描叙Java方法执行模型:执行方法时都会创建一个栈帧,存储局部变量,基本类型变量,引用等信息 3.Java本地方法栈:线程私有,为虚拟机使用到的Native方法服务 4.Java堆:线程共享,是垃圾收集器的主要工作地方:存储对象实例等 5.方法区:线程共享:存储类信息,常量,静态变量等 运行时常量:存放编译时生成的各种字面量和符号引用 6.直接内存:机器的内

Java解惑六:库之谜

本文是根据JAVA解惑这本书,做的笔记. 电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题56 BigInteger.BigDecimal以及包装类型的实例是不可改变. BigInteger five = new BigInteger("5"); BigInteger total = BigInteger.ZERO; total.add(five); //这并不会改变total的值,调用该方法的返回值,才是加法得到的结

【java解惑】&和&&、|和||使用

如下所示代码: public class Example042 { public static void main(String[] args) { int[][] tests = { { 6, 5, 4, 3, 2, 1 }, { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 } }; System.out.println("func1 out : " + func1(tests)); } private static int func1(int[

Java解惑(转)

数值表达式 1. 奇偶判断 不要使用 i % 2 == 1 来判断是否是奇数,因为i为负奇数时不成立,请使用 i % 2 != 0 来判断是否是奇数,或使用 高效式 (i & 1) != 0来判断. 2. 小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是 0.9,而是一连串的小数.问题在于1.1这个数字不能被精确表示为一个double,因此它被表示为最接近它的double值,该程序从2中减去的就是这个值,