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

Long の代わりに double を使用してみてください。

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 データ型が 10 進数値をサポートしていないためです。double に変換することで、10 進数値を維持できます。

于 2012-04-11T13:25:37.087 に答える
1

ロングの代わりに、除算の代わりに乗算することもできます。

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

除算は遅く、一部の数値を切り捨てる可能性があります。整数を除算することでさえ、floatまたはdoubleを乗算するよりも遅くなります(場合によっては?たとえば、AMDはfloatで最適であり、Intelは整数で最適です)。doubleの代わりにBigDecimal.divide(...)を使用すると、トリミングは防止されますが、速度は大幅に低下します。

私が考えることができる乗算の唯一の欠点は、本当に大きな数がオーバーフローすることです(つまり、計算されたintはInteger.MAX_VALUEよりも大きいか、Long.MAX_VALUEよりも長い可能性があります)。しかし、あなたの場合、定数しかないので、それが最良の選択です。

于 2012-04-11T13:33:55.607 に答える