有没有办法避免BigInteger / BigDecimal?

时间:2019-01-03 08:29:31

标签: java algorithm optimization bigdecimal

我需要计算这样的东西(伪代码):

// a, b, x, y are long, x,y <= 10^12

long i = (a - n)/(x*y)

long j = (b - n)/(x*y) - ceiling

有时x * y不合适。我想避免使用BigDecimal / BigInteger,因为它太贵了,在其他任何地方都不需要。是否有一个聪明的数学解决方案,例如有两个这样的长或长?

谢谢!

更新:不好意思,伙计们,还有一个约束:我也有一个如下计算的变量(也许也可以重写):

sum += x*y

我需要重新计算它以便与另一个变量进行比较以终止循环。

2 个答案:

答案 0 :(得分:0)

您可以分两次

type

很难理解您如何准确地使用此y = a / (b * c) y1 = a / b y = y1 / c 以及如何计算比较值,但是可以存储比较的结果而不是避免使用较大的值,例如sum> 0则result较大,如果结果<0则其他值较大,...

答案 1 :(得分:0)

我注意到比较sum的值很长。因此,我通过以下方式解决了这个问题:

  • 我正在这样计算i:(long)((((a-n)/(double)x)/ y))
  • 这里j :(长)Math.ceil((b-n)/(double)x * y)
  • 上述情况当然会溢出。但我避免在执行以下try-catch之前溢出:

            try {
                    xy = Math.multiplyExact(x, y);
                    ...
            } catch (ArithmeticException ex) {
                    // some handling
                    break;
            }
    

这种由代码制作的技巧足以使工作更快。

希望它对某人有帮助!

相关问题