0

如果我用不同的日期调用此方法,则差异结果的小数位 / 1000L / 60L / 60L / 24L 将始终被截断。我能做些什么来防止这种情况发生?我需要 4.xx 的结果。

public boolean checkDelayed(Date date1, Date date2)
{
    long difference = date2.getTime() - date1.getTime();

    if (difference / 1000L / 60L / 60L / 24L <= 4L)
    {
        return true;
    }

    return false;
}
4

2 回答 2

3

尝试使用双打而不是多头。

public boolean checkDelayed(Date date1, Date date2)
{
    double difference = (double) (date2.getTime() - date1.getTime());

    if (difference / 1000d / 60d / 60d / 24d <= 4d)
    {
        return true;
    }

    return false;
}

最好的方法是应用简单的数学。你的情况是这样的:

difference / 1000L / 60L / 60L / 24L <= 4L

像这样锻炼:

        difference / 60L / 60L / 24L <= 4000L
              difference / 60L / 24L <= 240000L
                    difference / 24L <= 14400000L
                          difference <= 345600000L

你有它。始终工作的简单条件。

public boolean checkDelayed(Date date1, Date date2)
{
    long difference = date2.getTime() - date1.getTime();

    if (difference <= 345600000L)
    {
        return true;
    }

    return false;
}

这一切的原因是 long 数据类型不支持十进制值。通过转换为双精度值,您将能够保留十进制值。

于 2012-04-11T13:25:37.087 回答
1

除了 long,您还可以乘以代替除法。

if (difference <= 4 * 1000 * 60 * 60 * 24 )
{
    return true;
}

划分速度较慢,并且有可能削减一些数字。甚至除以整数也比乘以浮点数或双精度数要慢(在某些情况下?例如,AMD 最好使用浮点数,Intel 使用整数)。使用 BigDecimal.divide(...) 而不是 double 会阻止修剪,但会更慢。

我能想到的乘法的唯一缺点是一个非常大的数字会溢出(即计算的 int 可能大于 Integer.MAX_VALUE,或者大于 Long.MAX_VALUE)。但在你的情况下,你只有常数,所以它是最好的选择。

于 2012-04-11T13:33:55.607 回答