问题 BigInteger与否还不是BigInteger?


在Java中,大多数基本类型都是有符号的(一位用于表示+/-),因此当我超出类型的限制时,我会得到意想不到的结果,比如负数。

有没有比使用BigInteger更好的解决方案,因为BigInteger存在性能问题,您需要使用类方法进行基本算术而不是语言运算符(废物可读性)?


11681
2018-05-05 20:07


起源

为什么你认为你会超过签名的64位长?你用什么代表这个数字? - Pyrolistical


答案:


不,没有更好的解决方案。如果您正在使用不能适合long或double的值,那么您将需要使用类似的引用类型 BigInteger,Java不支持运算符重载。

从技术上讲,我想你可以在有符号和无符号值之间进行一些映射,但是如果你的目标是干净而简单的代码那么这就完全没有了。


11
2018-05-05 20:10



+1“将您漂亮的代码转换为使用BigInteger非常令人沮丧”您的美丽代码显示了所涉及的值的大小顺序以及数据类型的限制。很少有实际用例可以溢出长(64位有符号整数),这些应该是可识别的。 - leonbloy
之间应该有一些东西 long 和BigInteger。 BigInteger太笨重了。 - Pacerier
实际上,BigInteger不是很笨重。任何类型的“inbetween”都不会更轻巧。 - Rudy Velthuis


Scala真的是这里的解决方案。在那种语言中,“运算符”实际上只是固定的方法,可以为任意类定义。事实上,在您的情况下,他们已经在标准库中。因此,您可以拥有特殊数字表示的强大功能,但Java原语类型的语法清晰。

Scala经过了强化,可与Java代码完全互操作。


4
2018-05-05 20:14



Groovy也是同样的选择。 - Yishai
是的,Scala是脚本语言实现这一点的一个很好的例子,特别是因为它编译为本机Java字节码! - Daniel


仍然拥有漂亮的商务逻辑的唯一方法是使用脚本语言,您可以编译为java类。在内部,您可以使用BigIntegers。


0
2018-05-05 20:13