有没有办法避免BigInteger/BigDecimal?

Is there a way to avoid BigInteger/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

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

你可以分两次

y = a / (b * c) 

y1 = a / b

y = y1 / c

很难理解您如何准确地使用这个 sum 以及如何计算比较值,但是是否可以存储比较结果而不是避免大值,例如 if result > 0 则 sum 较大,如果结果 < 0 则其他值较大,...

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

  • 我正在这样计算 i:(long) (((a - n) / (double) x) / y))
  • 这里是 j: (long) Math.ceil((b - n) / (double) x*y)
  • 上面的例子当然溢出来了。但是我防止溢出之前进行以下尝试捕获:

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

代码制作的这个技巧运行速度足够快。

希望对大家有所帮助!