【问题标题】:Check if Integer is too great检查整数是否太大
【发布时间】:2013-11-25 04:10:57
【问题描述】:

我正在开发一个交换系统,用户正在设置交换的价格和数量。

我想确保交换不大于 Integer 最大值,但我遇到了问题。

当兑换金额设置为9或更多时,即使我有检查以确保该数字不大于最大值,它也不起作用。我做了一些调试,当价格为 2,147,483,646(比最大数字少 1)时将金额设置为 9,它会打印出以下内容:

2,147,483,630 - 9

这是我的调试代码,我应该添加什么以确保不会发生这种情况?

public void setPrimaryAmount(int primaryAmount) {
        int price = primaryAmount * this.price;
        System.out.println(Misc.format(this.price * primaryAmount) + " - " + primaryAmount);
        if (price > Integer.MAX_VALUE ||
                price == Integer.MAX_VALUE ||
                price >= Integer.MAX_VALUE ||
                price < 0 || price <= 0 ||
                price++ == Integer.MAX_VALUE) {
            System.out.println("Attempted to set a bad amount.");
            return;
        }
        this.primaryAmount = primaryAmount;
    }

“尝试设置错误的金额”会打印出来,直到您输入的金额 >= 9。

【问题讨论】:

  • 你确实意识到,我希望,像price &lt; 0 || price &lt;= 0 这样的测试是多余的:price &lt;= 0 是完全足够的。 price &gt; Integer.MAX_VALUE || price == Integer.MAX_VALUE || price &gt;= Integer.MAX_VALUE 也是如此,除了一个整数变量永远不能大于 Integer.MAX_VALUE 的额外问题,所以你只需要 price == Integer.MAX_VALUE

标签: java integer max stack-overflow


【解决方案1】:

您不能将值存储在 int 中,然后然后检查它是否对于 int 来说太大了。而是将其存储在 long 中。

long price = (long)primaryAmount * (long)this.price;

【讨论】:

  • 请注意,转为长期持有可确保您可以在不溢出的情况下出售行星。
  • @Tyluur 如果我们很高兴答案解决了我们的问题,我们接受作为答案(选择勾号)。
【解决方案2】:

在 Java 8 中,一种方法是使用

Math.addExact(int, int);

如果结果溢出 int,则根据 Javadocs 将抛出 ArithmeticException。在其他版本中,我会推荐 Flight Odyssey 的建议,并至少在这些类型的检查中使用 long。

【讨论】:

    【解决方案3】:

    当设置 'price' 为 primaryAmount * this.price 以检查它是高于 Integer.MAX_VALUE 还是低于 Integer.MIN_VALUE 时,因为它是一个整数它会滚动,例如,一个 Integer 的值.MAX_VALUE += 1 将变为 Integer.MIN_VALUE ,反之亦然,因此不需要检查。您当然可以将其设为更大的数据类型,然后进行检查,但有一种更快的方法。 只要我们知道 this.price 是什么,我们就可以确定最大值 'primaryAmount' 在不超过 2,147,483,646 的情况下乘以 this.price,只需向后执行即可:

    int max = 2147483646 / this.price
    

    这个值可以作为一个简单修剪函数的最大值,以确保它在范围内,例如:

    private int confirmRange(int number, int max, int min) {
        if (number > max) number = max;
        if (number < min) number = min;
        return number;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2023-03-18
      • 2016-05-19
      相关资源
      最近更新 更多