2015-02-06 55 views
1

我正在研究有關停車場的練習。一旦汽車停放5分鐘,則需要支付全部1小時。所以我打算從下面的代碼中得到int 1,但是我得到了0.有些提示?爪哇 - 小時總數達到1

GregorianCalendar data1 = new GregorianCalendar(2015,1,4,11,10); 
GregorianCalendar data2 = new GregorianCalendar(2015,1,4,11,20); 
long b =(data2.getTimeInMillis()-data1.getTimeInMillis())/1000/3600; 
int k=(int)Math.ceil(b); 
System.out.println(k); 
+1

使用Math.ceil的(雙A),而不是地板嘗試。 http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html – user1933888 2015-02-06 06:53:35

+1

哪裏是date3? – silentprogrammer 2015-02-06 06:53:47

+1

你看過'Math.floor'是什麼嗎? – immibis 2015-02-06 06:56:26

回答

1
public static void main(String[] args) { 
     GregorianCalendar data1 = new GregorianCalendar(2015, 1, 4, 11, 10); 
     GregorianCalendar data2 = new GregorianCalendar(2015, 1, 4, 11, 20); 
     double b = (data2.getTimeInMillis() - data1.getTimeInMillis())/(1000.0 * 3600.0); 
     System.out.println(b); 
     int k = (int) Math.ceil(b); 
     System.out.println(k); 
    } 

輸出

0.16666666666666666 
1 

刷你的Math function here,真的很好用的作者解釋。

+0

太好了,非常感謝 – Turo 2015-02-06 07:12:06

+0

@Turo ok ,.那麼請接受/提出答案 – 2015-02-06 07:15:14

0

二認爲:

  1. B必須是雙。因爲如果你將差異分爲1000和3600,b不是一個長期價值。這是一個浮動的價值(0.16666666666666666);
  2. 使用Math.ceil而不是Math.floor。

Math.floor

返回最大的(最接近正無窮大)雙值 小於或等於該參數,並等於一個數學 整數

這將返回0

Math.ceil

返回大於或等於參數的最小值(最接近負無窮大)double值,它等於一個數學整數。

這會返回1,因爲1是下一個更大的整數

2

這應該工作:

GregorianCalendar data1 = new GregorianCalendar(2015,1,4,11,10); 
GregorianCalendar data2 = new GregorianCalendar(2015,1,4,11,20); 
double b =(data2.getTimeInMillis()-data1.getTimeInMillis())/1000.0/3600.0; 
double k=Math.ceil(b); 
System.out.println(k); 

您想使用doubleMath.ceil()和工作,讓你可以存儲小數。否則,當你做減法併除以3600,你可能會以450/3600long結束,你將以0結束,因此你爲什麼一直得到0

1

嘗試你的代碼重寫,以類似的東西

GregorianCalendar data1 = new GregorianCalendar(2015,1,4,11,10); 
GregorianCalendar data2 = new GregorianCalendar(2015,1,4,11,20); 
// b must be float 
float b =(data2.getTimeInMillis()-data1.getTimeInMillis())/1000; 
b = b /3600; 
int k=(int)Math.ceil(b); 
return k; 
0

這裏一個冗長和自我解釋的例子。如果endTimestartTime之前(由於某種原因),它也處理這種情況。

GregorianCalendar startTime = new GregorianCalendar(2015, 1, 4, 11, 10); 
GregorianCalendar endTime = new GregorianCalendar(2015, 1, 4, 11, 20); 
long parkingTimeMillis = startTime.getTimeInMillis() - endTime.getTimeInMillis(); 
long hoursToPay = TimeUnit.MILLISECONDS.toHours(parkingTimeMillis) + 1; 
System.out.println(hoursToPay); 
0

使用long b將輸出設置爲0.使用double或float。長數據類型是一個64位有符號二進制補碼整數。因此,無論你在RHS中做什麼,它都會導致整數四捨五入。所以我們假設你執行:

System.out.println((long) 1.9); 

它的輸出將是1而不是1.9。

這樣做

float b = (float) ((data2.getTimeInMillis() - data1.getTimeInMillis())/1000)/3600;