【问题标题】:Issue with saturation after calculations in Java在 Java 中计算后出现饱和问题
【发布时间】:2016-02-29 20:42:38
【问题描述】:

我正在创建一个逆波兰计算器,但遇到了饱和问题。我已经实现了一个堆栈,并且发现在没有问题的情况下我可以达到的最大数字是 2147483647。所以如果我将此数字推送到堆栈,然后加 1,我得到的结果是 -2147483648(否定)。我需要做的不是返回这个负数,而是返回原始数字2147483647。基本上以这个为限制。这同样适用于事物的消极方面,限制为 -2147483648。如果我错过了任何信息或者您需要查看代码,请告诉我。

【问题讨论】:

    标签: java math overflow calculator polish


    【解决方案1】:

    最大的int 值为2147483647,最小的为-2147483648int 值环绕,所以当你将 1 添加到 2147483647 时,你会得到 -2147483648,当你从 -2147483648 中减去 1 时,你会得到 2147483647

    如果你不想要这种行为,你可以这样做

    int a = 2147483647;
    a += 1.0;                   // a is still 2147483647
    

    int a = 2147483647;
    int b = (int) (a + 1.0);    // b is also 2147483647
    

    这些工作是因为a + 1.0 是使用double 计算的(没有溢出),并且使用大于Integer.MAX_VALUE 的数字会变成Integer.MAX_VALUE 的规则将结果转换回int

    【讨论】:

    • 我似乎无法让他的解决方案发挥作用?使用双打我返回这个 2.147483647E9。有什么想法吗?
    • @GeorgeBurslem 不,如果您有任何double 类型的变量,它将不起作用。所有变量的类型必须为int。如果您想要使用int 的解决方案,您可以使用int b = a == Integer.MAX_VALUE ? a : a + 1; 加1 和int c = a == Integer.MIN_VALUE ? a : a - 1; 减1。
    猜你喜欢
    • 2011-01-23
    • 2021-09-20
    • 1970-01-01
    • 2021-12-25
    • 2021-07-04
    • 2015-10-16
    • 2020-07-21
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多