Java - 最多1小时的小时数

时间:2015-02-06 06:50:20

标签: java

我正在做一个关于停车的练习。汽车停放5分钟后,需要支付1小时。所以我希望从下面的代码中获得int 1,但我得到的是0.一些提示?

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); 

6 个答案:

答案 0 :(得分: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);

您想使用Math.ceil()并使用double,以便存储小数位。否则,当您进行减法并除以3600时,最终可能会使用450 / 3600,而使用long,最终会得到0,因此您会继续获得0 {{1}}。

答案 1 :(得分: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,作者非常好解释。

答案 2 :(得分: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;

答案 3 :(得分:0)

两个人认为:

  1. b必须是双倍的。因为如果你将差值除以1000和3600 b不是langer长值。这是一个浮动锅值(0.16666666666666666);
  2. 使用Math.ceil而不是Math.floor。
  3. Math.floor

      

    返回最大(最接近正无穷大)双精度值   小于或等于参数,等于数学   整数

    这将返回0

    Math.ceil

      

    返回大于或等于参数且等于数学整数的最小(最接近负无穷大)double值。

    这将返回1,因为1是下一个更大的整数

答案 4 :(得分: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);

答案 5 :(得分: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;