在計算兩個日期相差多少的年的時候,我的思路是先拿到兩個時間的時間戳,得出差值,再除以一年的毫秒數,結果保留一位小數,這樣就可以得到兩個日期的年數差值,但是從有這個思路開始我便開始了填坑之路.
遇到的第乙個坑, 先把我一開始寫的**亮出來
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
最後又測試了兩次, 發現沒有問題了 大數值階乘計算函式
階乘往往由於數值巨大而無法用乙個long int或者double型別資料儲存。近日無聊寫了個大數值階乘的計算函式,理論上只要記憶體足夠,能夠計算出任何數值的階乘,但實際上100萬以上的階乘計算不管是時間消耗還是記憶體消耗都是極為驚人的,建議使用該函式計算100萬以下的階乘。為了有足夠的空間儲存結果,...
Java學習筆記5 大數值和陣列
當基本的整數和浮點數精度不能滿足需求,可使用 biginterger 和 bigdecimal。這兩個類可以處理包含任意長度數字序列的數值。biginteger 類實現了任意精度的整數運算,bigdecimal 實現了任意精度的浮點數運算。使用靜態的 valueof 方法可以將普通的數值轉換為大數值...
Java 數值溢位
經常出現在用 int 型別計算時間戳時出現的問題,以下是計算 60 天的毫秒間隔時發現的問題和測試記錄。system.out.println 60 24 60 60 1000 system.out.println 60 24 60 60 1000l 執行結果 889032704 5184000000...