随着计算机以及编程语言的不断发展,或许我们现在对于各种类型变量的上限已经不如C语言中的那么敏感。例如,int类型(整型)的变量,它的上限值已经远远超过以前C语言中的整型变量的上限。在一个典型的C语言中,int型变量的范围为-32768~32767,而在java中,int型的变量的范围就达到了-2147483648 到2147483647。因此,通常情况下,我们不用考虑溢出问题。但是,最近我在使用java计算时间差的时候,却遇到了一个诡异的错误,经过一段时间的检查,才发现居然是整型溢出的错误。
例如,我们现在打算计算两个时间点的年份之差,虽然有很多的函数能够帮我们解决这个问题(例如,先都取出年份值,再相减)。但是也可以直接通过两个时间点之间的数值差(因为,时间类型的数据在计算机中实际上是以long型的数值来存储的),来计算这种时间差。
下面演示的是错误的代码:
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2008-05-24 00:00:00");
Date date2 = sdf.parse("2009-05-24 00:00:00");
System.out.println((date2.getTime()-date.getTime())/((long)(1000*3600*24*365)));
其中,这段代码的最主要思想就是利用时间点2(date2)的数值,减去时间点1(date)的数值,然后除以1000,将毫秒数值转为秒;再除以3600*24,转为天;最后除以365转成年。代码的逻辑上是没有错误的(当然,严格上来说,应该区分365天或是366天,因而计算年份差是不推荐这么做的),但是执行的时候却总是出错,得到的结果为21!明眼人应该一下子就能够看出这两个时间点的年份差为1年吧。于是考虑将最后一行代码改为如下:
System.out.println((date2.getTime()-date.getTime())/((long)(1000*3600*24)));
发现就能够得到正确的结果:366天。于是再次将代码改为如下:
System.out.println((date2.getTime()-date.getTime())/((long)(1000*3600*24))/365);
发现就能够得到正确的结果了:1年。但是如果将代码又改为第一种情况,就发现还是计算错误。在这种情况下,最有可能的原因就是变量的溢出问题。我们可以计算一下,1年的毫秒数为:
1000*3600*24*365 = 31536000000 ms/year
原来已经远远超过了int型变量的最大值:2147483647了。于是将计算代码改为如下,也能够正确获得结果:
System.out.println((date2.getTime()-date.getTime())/(((long)(3600*24*1000))*((long)(365))));
看来,虽然计算机的支持能力以及编程语言的发展,已经能够然我们很便捷的使用各种变量,但是有时候还是需要注意一下这些类型变量所支持的范围,避免以为超过范围,造成莫名其妙的溢出错误。
分享到:
相关推荐
编写程序,将一个整数倒排过来,例如:给定整数:453268751,得到的结果:157862354
给定一个正整数a,以及另外的5个正整数,问题是:这5个整数中,小于a的整数的和是多少? 输入要求 输入一行,只包括6个小于100的正整数,其中第一个正整数就是a。 输出要求 输出一行,给出一个正整数,是5个数中...
在Java编程语言中,判断一个整数是否为质数是一个常见的数学问题,也是计算机科学基础课程中的典型示例。质数定义为只能被1和它本身整除的大于1的自然数,例如2、3、5、7、11等。在实际应用中,检查一个数是否为质数...
利用Java编写程序从键盘输入一个整数,计算并输出该数的数字之和。例如:请输入一个整数:8899123各位数字之和为:40
在Java编程语言中,求解一个整数的因子是一个常见的任务,这涉及到基本的数学运算和数组处理。本文将深入探讨如何使用Java编写程序来找到一个整数的所有因子。 首先,因子是能够整除给定整数的正整数。例如,如果n=...
编写一个Java程序从键盘获分别取读取两个整数,并计算这两个整数之和
以上就是关于"java GuessNumber给你一个1至100之间的整数,请猜测这个数java"这个游戏的基本实现和相关知识点。这个简单的游戏可以帮助初学者掌握Java的基本语法、数据类型、输入输出以及控制流。同时,对于更高级的...
2. **实现比较方法:** 编写一个`compareInt`方法,该方法接受两个整数作为参数,并返回一个整数。如果第一个数放在前面组成的数字更大,则返回负数;如果第二个数放在前面组成的数字更大,则返回正数;如果两者相等...
- **`Calendar` 类**:Java标准库中的一个实用类,用于处理日期和时间相关的操作。 - **`Scanner` 类**:用于从标准输入流读取数据,便于用户交互。 #### 3. 程序结构分析 - **主函数 `main`**:程序的入口,负责...
这个问题的核心是找到所有可能的方式,将一个给定的正整数N拆分为一系列非负整数之和,且每个部分都是正整数。在计算机科学中,这类问题通常被归类为回溯或动态规划问题。 描述中的“补充2019-07-18的源码”表明这...
在Java编程语言中,处理大整数是一项重要的任务,特别是在需要进行高精度计算或存储超出普通整型数据类型范围的数值时。实验标题"JAVA实验报告 处理大整数"涉及的核心知识点是使用`java.math.BigInteger`类来处理...
在Java编程语言中,求解一个整数的因子是一个常见的问题。因子,也称为因数,是能够整除给定整数的正整数。在这个问题中,我们需要编写一段代码来找出并打印出一个整数的所有因子。下面,我们将详细讨论如何实现这个...
`会输出四个整数和一个浮点数(商保留两位小数),各数值之间用空格分隔。 8. **格式化字符串**: 在`printf()`函数中,`%d`用于输出整数,`%.2f`用于输出浮点数并保留两位小数。格式化字符串允许我们精确控制输出...
java小程序。猜数字游戏:随机产生一个100以内的正整数,用户通过键盘输入所猜的数字,并给与相应的提示(有代码详细解释)
java代码-使用java输入参数为一个整数,输出为该整数各个位上的最大数字的源代码 ——学习参考资料:仅用于个人学习使用!
### Java 显示整数个位数 #### 知识点概览 1. **Swing 组件使用**:包括 `JFrame`、`JTextField` 和 `JLabel`。 2. **事件监听器**:使用 `ActionListener` 来响应文本框中的输入事件。 3. **数字处理**:提取整数...
在Java编程语言中,实现一个整数位计算器是一项基础但重要的练习,可以帮助初学者更好地理解基本的编程概念,如变量、运算符、控制流程以及面向对象编程思想。本项目主要涉及以下几个关键知识点: 1. **变量与数据...
Java API 提供了许多强大且高效的工具,但有些功能往往被开发者忽视。在处理排序问题时,许多初学者可能选择从网上查找代码或者自己实现排序算法,例如选择排序、冒泡排序、插入排序、堆排序、快速排序和归并排序等...
本文将深入解析一个特定的Java代码片段,该代码旨在生成1到100之间的随机整数,并特别关注于识别并输出连续出现次数超过指定阈值的数字序列。 ### 核心知识点 #### 1. 随机数生成 代码中使用`Math.random()`函数来...