2014-06-05 102 views
3

我在Java中遇到了一個真正的大數字問題。 我目前正試圖將大量的秒數轉換成年,日,小時,分鐘和剩下的秒數。 我的代碼看起來是這樣的:`Java將秒轉換爲年日小時分秒

import java.util.Scanner; 


public class timer { 


public static void main(String[] args){ 



    double sum = 1.1078087563769418E16; 

    double sec=0; 
    double min=0; 
    double hou=0; 
    double da=0; 
    double yea=0; 


    yea=sum/31536000; 
    int year = (int) yea; 
    sum=sum-year*31536000; 

    da=sum/86400; 
    int day = (int) da; 
    sum=sum-day*86400; 

    hou=sum/3600; 
    int hour = (int) hou; 
    sum=sum-hour*3600; 

    min=sum/60; 
    int minute = (int) min; 
    sum=sum-minute*60; 

    sec=sum; 
    int second = (int) sec; 
    sum=sum-second*60; 

    System.out.println(year+" "+day+" "+hour+" "+minute+" "+second);    
} 
} 

`

當雙「和」是一樣大,因爲它是,輸出會很奇怪。例如,雙「日」變得大於365,這應該是不可能的。

任何解決方案?

回答

0

您可以使用java.math。 BigDecimal類,如果您需要以極高的精度表示數字。

如果你需要巨大的整數,你可以使用java.math。 BigInteger

1

溢出該計算sum=sum-year*31536000;

year31536000均爲整數,它們的乘積是〜1E16,這比Java的最大整數尺寸。改爲使用sum = sum-year*31536000.0

作爲示範,你計算year後添加以下代碼:整數溢出:

System.out.println(year * 31536000.0); // 1.1078087556672E16 
System.out.println(year * 31536000); // 1100687872 
1

您用一個很常見的問題,大多數開發人員應該知道面對的問題。

Your year變量是一個int,第二次 - >年轉換的常量是常量int,所以int * int是... int。除了如果你的年份大於約68,結果不能適合int。因此 - 溢出和愚蠢的結果。

你有幾個可用的選項給你:

  1. 做你的時間戳算術多頭。真的,無論如何,這是行業標準。
  2. 如果你堅持精度超過微秒(或者如果你只關注上個世紀的nano) - BigDecimal或BigInteger是你的朋友。
  3. 使用concurrent包中的TimeUnit類。它沒有來,但確實有天還不轉換很好(JodaTime會更好雖然)
0
 First use long not double then try this logic 

      long min = sum/(60) % 60; 
      long hou = sum/(60 * 60)% 24; 
      long da = sum/(60*60*24)%30; 
      long yea = sum/(60*60*24*30)%365; 

如果這個數字已經超出了長然後使用BigInteger的限額,但隨後這種計算將不工作。

+0

您的解決方案完全忽略了秒,這是特別要求的OP。 –

相關問題