【问题标题】:why is 24 * 60 * 60 * 1000 * 1000 divided by 24 * 60 * 60 * 1000 not equal to 1000 in Java?为什么 24 * 60 * 60 * 1000 * 1000 除以 24 * 60 * 60 * 1000 在 Java 中不等于 1000?
【发布时间】:2009-08-19 17:15:52
【问题描述】:

为什么 24 * 60 * 60 * 1000 * 1000 除以 24 * 60 * 60 * 1000 不等于 Java 中的 1000?

【问题讨论】:

  • 因为Java在东西方向上延伸,所以一天比86400000000微秒长一点:-)
  • 我认为要使这个问题有意义,它必须指定它的意思是 int's 而不是 long's。没有显示实际代码或指定,问题是模棱两可的。这是我在学校考试中讨厌的那种问题——我应该回答“它确实等于1000”(正确,如果假设是多头的话)还是我应该猜测教授的意思一切都以整数形式完成,因此提到溢出?

标签: java puzzle math


【解决方案1】:

因为乘法会溢出 32 位整数。 64 位就可以了:

public class Test
{
    public static void main(String[] args)
    {
        int intProduct = 24 * 60 * 60 * 1000 * 1000;
        long longProduct = 24L * 60 * 60 * 1000 * 1000;
        System.out.println(intProduct); // Prints 500654080
        System.out.println(longProduct); // Prints 86400000000
   }
}

显然,在乘法溢出后,除法不会“撤消”溢出。

【讨论】:

  • 1000 天 * 1000 到底是什么意思?
  • 那些一定是他们一直在谈论的新“公制年份”。
  • 1000 天 * 1000 将是 1,000,000 天。这并没有什么神秘之处。现在,1000 英寸 x 1000 英寸是 1,000,000 平方英寸,所以大概 1000 天 x 1000 天就是 1,000,000 平方天。但我不确定什么是“方形日”。也许这是旅行者在处理泛维空间时使用的时间计量单位。
  • 天? 24*60'60*1000*1000 是一天中的微秒数。 :)
  • 我认为这取决于单位,是一天中的微秒还是公制年中的天?
【解决方案2】:

你需要从 24L * 60 * ... 开始,因为 int 会溢出。

顺便说一句,您的问题是来自 Java PuzzlersPuzzle 3: Long Division 的复制/粘贴;)

【讨论】:

    【解决方案3】:

    如果要执行该计算,则必须重新排序操作(以避免溢出)或使用更大的数据类型。真正的问题是Java中固定大小整数的算术不是关联的。这很痛苦,但需要权衡取舍。

    【讨论】:

    • 重新排列数字不会避免溢出
    • @cherouvim,但可以重新排序操作。
    • 我相信 Thom 正在谈论重新排序乘法,所以你可以这样做:((24 * 60)/(24 * 60)) * ((1000 * 1000)/(1000*1000 ))
    • 固定大小的整数是模数的整数(残基类环),因此除除之外的操作具有所有通常的良好属性(关联、交换、分配......)。但是,这不适用于浮点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2011-02-09
    • 2021-03-30
    • 2017-03-30
    • 2016-07-17
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多