java大數值計算

2021-08-25 22:49:01 字數 2054 閱讀 3044

在計算兩個日期相差多少的年的時候,我的思路是先拿到兩個時間的時間戳,得出差值,再除以一年的毫秒數,結果保留一位小數,這樣就可以得到兩個日期的年數差值,但是從有這個思路開始我便開始了填坑之路.

遇到的第乙個坑, 先把我一開始寫的**亮出來

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...