java大数值计算

在计算两个日期相差多少的年的时候,我的思路是先拿到两个时间的时间戳,得出差值,再除以一年的毫秒数,结果保留一位小数,这样就可以得到两个日期的年数差值,但是从有这个思路开始我便开始了填坑之路.
遇到的第一个坑, 先把我一开始写的代码亮出来

Date date1 = DateUtils.format(LocalDateTime.now());
Date date2 = DateUtils.format(LocalDateTime.now().minusYears(1));
long t = date1.getTime() - date2.getTime();
double d = t / (1000 * 60 * 60 * 24 * 365);
System.out.println(d); // d=21.0

看到这个d的输出结果的第一瞬间是懵逼,为什么不是我想要的结果, 难道是我长太丑了吗? 毫无疑问,我这么帅的颜值怎么可能丑, 然后我就开始debug, 发现问题出在了这一段

(1000 * 60 * 60 * 24 * 365) // 1471228928

输出结果为什么不是我想要的31536000000(一年的毫秒值), 再一次对自己的颜值产生了质疑, 不对, 要保持清醒, 我怎么可能丑, 肯定是超出int最大范围了, 对了, 确实超出了, 然后我就做了如下调整:

(1000L * 60L * 60L * 24L * 365L) // 31536000000

好, 得到了我想要的结果, 看样子问题是解决了, 我再开运行一下试试. 咦? 好像可以了 , 为了保险我又换了种方法试了下

Date date1 = DateUtils.format(LocalDateTime.now());
Date date2 = DateUtils.format(LocalDateTime.now().minusMonths(42)); // 注意这儿不同
long t = date1.getTime() - date2.getTime();
double d = t / (1000L * 60L * 60L * 24L * 365L);
System.out.println(d); // d=3.0

输出的结果差点让我吐血, 为什么换了一种写法就不对了, 我想要的明明是3.5啊. 不行, 看样子不能这么直接进行long类型的除法运算, 我要换成BigDecimal, 然后我就做了如下调整.

Date date1 = DateUtils.format(LocalDateTime.now());
Date date2 = DateUtils.format(LocalDateTime.now().minusMonths(42));
long t = date1.getTime() - date2.getTime();
BigDecimal d = new BigDecimal(t).divide(new BigDecimal(1000L * 60L * 60L * 24L * 365L), 1); // 注意这里
System.out.println(d); // d=3

还不是我想要的结果啊, 这是怎么了? 不行, 那我就再改!

Date date1 = DateUtils.format(LocalDateTime.now());
Date date2 = DateUtils.format(LocalDateTime.now().minusMonths(42));
long t = date1.getTime() - date2.getTime();
BigDecimal d = new BigDecimal(t).divide(new BigDecimal(1000L * 60L * 60L * 24L * 365L), 1, RoundingMode.HALF_UP); // 注意这里
System.out.println(d); // d=3.5

最后又测试了两次, 发现没有问题了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值