检查整数是否太大

时间:2013-11-25 04:10:58

标签: java integer max stack-overflow

我正在研究交易系统,用户正在设定交易所的价格和金额。

我想确保交换不超过整数最大值,但我遇到了问题。

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

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。

3 个答案:

答案 0 :(得分:8)

您无法在int中存储值,然后检查它是否对于int来说太大了。把它存放在一个很长的位置。

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

答案 1 :(得分:3)

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

Math.addExact(int, int);

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

答案 2 :(得分:0)

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

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;
}