[英]Java converting seconds to year day hours minute seconds
關於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,這應該是不可能的。
有解決方案嗎
計算sum=sum-year*31536000;
溢出sum=sum-year*31536000;
year
和31536000
都是整數,它們的乘積是〜1E16,大於java的最大整數。 請改用sum = sum-year*31536000.0
。
作為演示,在計算year
后添加此代碼:
System.out.println(year * 31536000.0); // 1.1078087556672E16
System.out.println(year * 31536000); // 1100687872
您面臨着一個大多數開發人員應該了解的非常常見的問題:整數溢出。
你的year變量是一個int,second-> year轉換的常量是常量int,所以int * int是... int。 除非你的年份大於約68,否則結果不適合int。 因此 - 溢出和愚蠢的結果。
您有幾種選擇:
TimeUnit
從類concurrent
包。 它沒有幾年,但確實有幾天並且很好地進行轉換(盡管JodaTime會更好) 你可以使用java.math。 BigDecimal類,如果你需要高精度地表示數字。
如果需要大整數,可以使用java.math。 BigInteger 。
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;
如果該數字超出了long的限制,那么使用BigInteger但是這個計算將不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.