Java 整数需要较大的基元类型

Java 整数需要较大的基元类型,java,long-integer,Java,Long Integer,我有一个java程序,可以将大量的数字相乘。输出是长的,但太小,输出为0。我不认为有更大的原始类型 我可以这样做的方法是使用biginger类,但是我必须使用它的multiply()和divide()方法,而不是常规的*和/,这将非常不方便 以下是代码行: System.out.printf("c) In how many of the arrangements in part (a) are all the vowels adjacent?%n " + "(7! / (2!2!))(6!

我有一个java程序,可以将大量的数字相乘。输出是长的,但太小,输出为0。我不认为有更大的原始类型

我可以这样做的方法是使用
biginger
类,但是我必须使用它的
multiply()
divide()
方法,而不是常规的
*
/
,这将非常不方便

以下是代码行:

System.out.printf("c) In how many of the arrangements in part (a) are all the vowels adjacent?%n    " + "(7! / (2!2!))(6! / 3!2!) = " + (new Factorial(7).r / new Power(new Factorial(2).r,2).r) * (new Factorial(6).r / (new Factorial(6).r * new Factorial(2).r)) + "%n");
它使用了我的
Factorial
Power
类,而且太大了

是否有一个更长的数字类仍然可以使用
*
/
?还是有其他更容易使用的数字类

谢谢。

基本类型(byte、short、int、long)是经典类型,在其他语言中(比如C、C++)通常由处理器体系结构定义。因此,根据您的CPU类型,long可能是16位、32位或64位

现在,Java改变了这一点,并将这种类型固定到一定长度,而不考虑处理器架构

如果需要处理较大的数字,只剩下
biginger
BigDecimal
和类似的选项。请注意:这些类型不使用CPU指令,而是“手动”进行数学运算,这意味着它们的速度相当慢(想想1000倍)

另一方面,您正在谈论的内容——将
*
/
与这些类型一起使用被称为。一些编程语言支持它,但在Java中这是一个很大的禁忌。有一些预编译器(请参阅),但上次我听说它不适用于
biginger


您可以使用或编写程序——它们都在JVM上运行(Groovy的语法与Java非常相似——主要是将.Java重命名为.Groovy works),并且都支持
biginger
的运算符重载。您可以尝试使用double,它比long大,并且只使用整数部分

否则,您可以创建自己的integer类,该类将包含两个或三个long, 然后使用移位和位运算符来处理数学运算,但这并不容易


最后一个解决方案是用一个非常大的整数编写C++代码,用java生成的EXE,但是这个解决方案会破坏代码的可移植性。

NO.CUD>长< /COD>是最长的。不,你基本上被困在<代码> BigInteger < /C>。另外请注意,反斜杠不是运算符-您的意思是
/
。顺便说一句:您发布的行应该可以正常工作:
!21
将是第一个溢出(结果不应为0)。运算符重载是“一个大禁忌”?你让它听起来像是一个禁忌。Java只是不支持它,仅此而已。@Jesper我的意思是Java不支持它,将来也不可能支持它。关于在Java中支持它有很多争议,他们总是决定反对它。所以,是的,在Java中这似乎是一个禁忌话题。@Jon注意,如果使用
double
而不是
long
,则会降低精度。当你使用
double
@Jesper时,不要期望得到准确的答案,我会注意到这一点。