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

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

你可能感兴趣的:(java)