【问题标题】:A long bigger than Long.MAX_VALUE大于 Long.MAX_VALUE 的 long
【发布时间】:2013-05-08 21:40:02
【问题描述】:

如何获得大于 Long.MAX_VALUE 的长数?

我希望这个方法返回true:

boolean isBiggerThanMaxLong(long val) {
    return (val > Long.MAX_VALUE);
}

【问题讨论】:

    标签: java long-integer


    【解决方案1】:

    该方法无法返回true。这就是Long.MAX_VALUE。如果它的名字是……假的,那将是真的混乱。那么它应该被称为Long.SOME_FAIRLY_LARGE_VALUE 并且实际上具有零合理用途。只需使用Android's isUserAGoat,或者您可以滚动您自己的函数,该函数始终返回false

    请注意,内存中的long 占用固定数量的字节。 From Oracle:

    long:long 数据类型是一个 64 位有符号二进制补码整数。它的最小值为-9,223,372,036,854,775,808,最大值为9,223,372,036,854,775,807(含)。当您需要比 int 提供的值范围更广的值时,请使用此数据类型。

    您可能从基础计算机科学或离散数学中知道,很长一段时间内有 2^64 个可能的值,因为它是 64 位。正如你从离散数学或数论或常识中知道的那样,如果只有有限多种可能性,其中之一必须是最大的。那将是Long.MAX_VALUE。所以你在问类似于“是否有一个大于 0 且小于 1 的整数?”数学上毫无意义。

    如果您确实需要此功能,请使用 BigInteger 类。

    【讨论】:

    • 有人应该通过发明隐形传送或至少为山羊创建一个安卓小工具来破解 isUserAGoat API 以太。
    • @gongshw 假设 triangle.lborderAlong 然后您可以删除该检查。如果它优化出来,我不会感到惊讶。
    • 要测试的源代码包含判断“triangle.lborderA > 0 && triangle.lborderA
    • @gongshw 尝试使用lborderA < 0 以使检查失败。同样,您不能通过if(Boolean.TRUE) 的检查失败。
    • @Mr.Me 嗯,按照this answer的说法,如果你下载了com.coffeestainstudios.goatsimulator的包,就可以开始山羊的传送了!
    【解决方案2】:

    你不能。如果你有一个名为isBiggerThanMaxLong(long) 的方法,它应该总是返回false

    如果要增加Long.MAX_VALUE 的位,下一个值应该是Long.MIN_VALUE。阅读二进制补码,这应该会告诉您原因。

    【讨论】:

      【解决方案3】:

      首先,下面的方法无法编译,因为它缺少返回类型,它应该是Long.MAX_VALUE 代替Long.Max_value

      public static boolean isBiggerThanMaxLong(long value) {
            return value > Long.Max_value;
      }
      

      上述方法永远不会返回 true,因为您将 long 值与 Long.MAX_VALUE 进行比较,请参阅方法签名,您只能在那里传递 long。任何 long 都可以与 @ 一样大987654330@,不能大于这个。

      您可以使用BigInteger 类尝试这样的事情:

      public static boolean isBiggerThanMaxLong(BigInteger l){
          return l.compareTo(BigInteger.valueOf(Long.MAX_VALUE))==1?true:false;
      }
      

      以下代码将返回true

      BigInteger big3 = BigInteger.valueOf(Long.MAX_VALUE).
                        add(BigInteger.valueOf(Long.MAX_VALUE));
      System.out.println(isBiggerThanMaxLong(big3)); // prints true
      

      【讨论】:

        【解决方案4】:

        如果triangle.lborderA确实很长,那么原始代码中的测试是微不足道的,没有办法测试它。也没用。

        但是,如果triangle.lborderA 是双精度数,则比较很有用并且可以进行测试。 isBiggerThanMaxLong(1e300) 确实返回 true。

          public static boolean isBiggerThanMaxLong(double in){
            return in > Long.MAX_VALUE;
          }
        

        【讨论】:

        • isBiggerThanMaxLong(Long.MAX_VALUE + 1.0) 将返回 false。 isBiggerThanMaxLong(Long.MAX_VALUE + 1024.0) 也将返回 false。你得到了双打> = Long.MAX_VALUE + 1025.0
        • @Samil True。对于任何大于 Long.MAX_VALUE(其中有很多)的双精度数,它将返回 true。由于浮点数舍入,Long.MAX_VALUE+1.0 不是其中之一。
        【解决方案5】:

        记住 BigInteger 是一个类,而 long 是一个原语。如果您想比较比 long_max_value 更大的值,请将您的值包装在 BigInteger 类中并将它们视为对象。

        【讨论】:

          猜你喜欢
          • 2019-11-24
          • 2019-12-12
          • 1970-01-01
          • 2020-05-14
          • 2021-08-06
          • 2012-12-20
          • 2012-01-13
          • 2015-11-01
          • 1970-01-01
          相关资源
          最近更新 更多