2015-02-06 61 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;