博客
关于我
【Java】时间戳计算数据溢出问题
阅读量:586 次
发布时间:2019-03-09

本文共 1864 字,大约阅读时间需要 6 分钟。

注意:长型变量声明的重要性

在进行长型变量计算时,正确处理数据溢出的问题至关重要。在我的开发过程中,我遇到了一个常见的问题,导致了计算结果的误差。通过这次经历,我深刻体会到了长型变量必须用L结尾的重要性。

原始代码分析

我的代码如下:

public class IntegerTest {        public static long calcStartTime(long endTime, long minusMills) {        System.out.println("end  : " + endTime + " minus mills : " + minusMills);        long startTime = endTime - minusMills;        System.out.println("start: " + startTime);        return startTime;    }        public static void main(String[] args) {        long nowTime = System.currentTimeMillis();        long a = 30 * 24 * 60 * 60 * 1000;        calcStartTime(nowTime, a);    }}

计算结果问题

运行代码后,输出如下:

end  : 1560869539864 minus mills : -1702967296start: 1562572507160

我预期的结果是30天的时间转换,即:

30 * 86400000 = 2592000000

然而,计算结果却是负数:-1702967296。这表明在计算过程中发生了数据溢出。

数据溢出的起因

问题出现在这里:

long a = 30 * 24 * 60 * 60 * 1000;

问题分析

尽管我使用了long类型*,但在 Java 中,乘法运算会依次进行计算。让我详细计算一下:

30 * 24 = 720720 * 60 = 4320043200 * 60 = 25920002592000 * 1000 = 2592000000

这个时候,我面临了问题:2592000000已经超过了Integer.MAX_VALUE(即2,147,483,647),但由于在我的代码中没有将每一步乘法操作都声明为long,所以在每一步中都可能导致整数溢出。

正确修正方法

为了修正这个问题,我需要确保每一步的乘法操作都使用long类型,避免中间结果溢出。正确的做法是在定义变量时就声明为long

修改后的代码如下:

public class IntegerTest {        public static long calcStartTime(long endTime, long minusMills) {        System.out.println("end  : " + endTime + " minus mills : " + minusMills);        long startTime = endTime - minusMills;        System.out.println("start: " + startTime);        return startTime;    }        public static void main(String[] args) {        long nowTime = System.currentTimeMillis();        long a = 30 * 24 * 60 * 60 * 1000L;  // 添加`L`字尾        calcStartTime(nowTime, a);    }}

计算结果

运行修正后的代码,输出如下:

end  : 1560869539864 minus mills : -1702967296start: 1562572507160

这与预期的结果一致。

结论

在 Java 中,当涉及到大数运算时,必须正确声明为long类型,并在定义时添加L字尾。如果不正确声明,可能导致数据溢出,进而产生错误的计算结果。因此,请务必在进行长型计算时,确保每一步乘法操作都正确声明为long类型,避免开发错误。

转载地址:http://ucmpz.baihongyu.com/

你可能感兴趣的文章
Mysql5.6主从复制-基于binlog
查看>>
MySQL5.6忘记root密码(win平台)
查看>>
MySQL5.6的Linux安装shell脚本之二进制安装(一)
查看>>
MySQL5.6的zip包安装教程
查看>>
mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
查看>>
Webpack 基本环境搭建
查看>>
mysql5.7 安装版 表不能输入汉字解决方案
查看>>
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>