【问题标题】:1000 * 60 * 60 * 24 * 30 results in a negative number [duplicate]1000 * 60 * 60 * 24 * 30 结果为负数[重复]
【发布时间】:2013-06-20 18:37:02
【问题描述】:

我试图通过乘以毫秒来计算 30 天,但结果始终是 days_30 值的负数,我不知道为什么。

非常感谢任何建议!

代码片段:

// check to ensure proper time has elapsed
                SharedPreferences pref = getApplicationContext()
                        .getSharedPreferences("DataCountService", 0);
                 long days_30 = 1000 * 60 * 60 * 24 * 30;
                 long oldTime = pref.getLong("smstimestamp", 0);
                long newTime = System.currentTimeMillis();
                 if(newTime - oldTime >= days_30){

days_30 值导致:-1702967296

附言

 double days_30 = 1000 * 60 * 60 * 24 * 30;
                 double oldTime = pref.getLong("smstimestamp", 0);
                double newTime = System.currentTimeMillis();
                 if(newTime - oldTime >= days_30){

导致较小但仍为负数。 -1.702967296E9

【问题讨论】:

标签: java android math long-integer negative-number


【解决方案1】:

您将ints 相乘,并且由于the maximum integer is 2^31 - 1 而发生溢出。只有在乘法之后,它才会转换为long。将第一个数字转换为long

long days_30 = (long) 1000 * 60 * 60 * 24 * 30;

或使用long 文字:

long days_30 = 1000L * 60 * 60 * 24 * 30;

这将强制 long 从一开始就进行数学运算。

【讨论】:

    【解决方案2】:
       long days_30 = 1L * 1000 * 60 * 60 * 24 * 30;
    

    【讨论】:

      【解决方案3】:

      只需将乘法更改为long days_30 = 1000L * 60 * 60 * 24 * 30;

      【讨论】:

        【解决方案4】:

        Java 在原始数据类型方面存在局限性。如果你的 long 或 double 太大,那么它会溢出成负数。尝试使用 BigInteger 类来存储更大的数字。

        看看这个:

        How does Java handle integer underflows and overflows and how would you check for it?

        【讨论】:

        • A long 在这种情况下就足够了
        • 如果“计算机在数字方面有局限性”,那么 BigInteger 将如何提供帮助?
        • 如果double 超出其范围,则结果为POSITIVE_INFINITY(或NEGATIVE_INFINITY),而不是溢出。
        • 很抱歉解释不清楚。 Java 限制原始数据类型。例如,long 和 double 是 64 位(不包括开销)。但是,如果您使用 Java 对象(或从 Object 扩展的类),则其大小可以与计算机的内存一样大(或崩溃前的剩余空间)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-05
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 1970-01-01
        • 2013-09-08
        相关资源
        最近更新 更多