为什么使用long时,20岁的阶乘在java中不起作用?

时间:2016-06-05 01:17:22

标签: java long-integer factorial

我正在创建一个程序,它将使用long基本类型找到阶乘,只有在21的阶乘时才能找到它。答案它给了我-4249290049419214848当答案应该是5109094217000000000并且长的最大值是9223372036854775807.我不知道为什么当这个数字小于9223372036854775807时它不会给我5109094217000000000。 这是我的代码

long j = 1;
for(int i = 1; i <= 21; i++){
    j *= i;
}
System.out.println(j);

4 个答案:

答案 0 :(得分:1)

21!不是5,109,094,217,000,000,000。

51,090,942,171,709,440,000

大于use app\models\MyRulesModel; use yii\data\Pagination; use yii\db\ActiveRecord; use yii\data\ActiveDataProvider; use yii\helpers\ArrayHelper; use yii\base\Model; class Controller MyruleController extends \yii\web\Controller { public function actionMyrules() { $model = new MyRulesModel; $query = MyRulesModel::find()->orderBy("seq_no ASC"); $dataprovider = new ActiveDataProvider(['query'=> $query , 'pagination'=> ['pagesize'=>20]]); echo $this->render('/network/myrules',['my_model'=>$dataprovider]); } } ,9,223,372,036,854,775,807。因此it overflows

答案 1 :(得分:0)

这可能有所帮助:

  

long :长数据类型是64位二进制补码整数。带符号长度的最小值为-2 63 ,最大值为2 63 -1。在Java SE 8及更高版本中,您可以使用long数据类型来表示无符号的64位长,其最小值为0,最大值为2 64 -1。当需要比int提供的值更宽的值时,请使用此数据类型。 Long类还包含compareUnsigned,divideUnsigned等方法,以支持unsigned long的算术运算。

来自:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

答案 2 :(得分:0)

来自http://www.javawithus.com/programs/factorial-using-big-integer

的想法

大于或等于21的因子会产生溢出,因此有必要使用其他东西。 Big-Integer是理想的选择。

这或多或少是实施:

0, 1, 2, 3

答案 3 :(得分:0)

长变量溢出.. 21!是51090942171709440000大于Long.MAX_VALUE

    long product = 1;
    for(int i = 1; i <= 21; i++){
        product = product * i;
        System.out.println(product);
        if(product < 0 ) {
            System.out.println("Overflow");
        }
    }