加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java:基本数学错误?

发布时间:2020-12-15 05:09:12 所属栏目:Java 来源:网络整理
导读:我必须在这里做一些根本错误的事情.我的代码非常简单: private static final long MILLIS_PER_YEAR = 1000 * 60 * 60 * 24 * 365;//...public long getAge() { long millis = System.currentTimeMillis() - this.getBirthdate().getTime(); System.out.prin
我必须在这里做一些根本错误的事情.我的代码非常简单:

private static final long MILLIS_PER_YEAR = 1000 * 60 * 60 * 24 * 365;

//...

public long getAge() {
    long millis = System.currentTimeMillis() - this.getBirthdate().getTime();
    System.out.println("Computed age:  " + (millis / MILLIS_PER_YEAR) + ",birthdate=" + this.getBirthdate() + ",birthdateMillis=" 
            + this.getBirthdate().getTime() + ",now=" + new Date() + ",nowMillis=" + System.currentTimeMillis() 
            + ",elapsedMillis=" + millis);
    return millis / MILLIS_PER_YEAR;
}

…但它会给出一些完全不正确的输出:

Computed age:  248,birthdate=2001-01-01 10:00:00.0,birthdateMillis=978307200000,now=Fri Aug 10 16:56:48 EST 2012,nowMillis=1344581808173,elapsedMillis=366274608173
Computed age:  184,birthdate=2004-01-01 10:00:00.0,birthdateMillis=1072915200000,elapsedMillis=271666608173

如果我手动运行相同的计算(or by using Google),我得到correct result(在合理的补贴范围内,因为实际年份略多于365天).

同样的数学在这段代码中产生这种无意义的输出怎么样?

解决方法

MILLIS_PER_YEAR的值是错误的.它是1471228928而不是所需的31536000000.

查看值的计算:所有参与的值都是int值(数值,非十进制常量在Java中默认为int值).这意味着计算结果也是一个int值.但是所需的值大于int可以容纳的值,因此您将有溢出.

要确保对长值进行计算,只需将至少一个值设为long(通过附加L后缀):

private static final long MILLIS_PER_YEAR = 1000L * 60 * 60 * 24 * 365;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读