Fatorial negativo em Java

Olá pessoal, boa noite! Sou novo em Java, comecei a aprendê-la nessa semana.
Fiz um programa simples que calcula o fatorial de um número:

import java.util.Scanner;
class fatorial{
public static void main(String[] args){

    Scanner ler = new Scanner(System.in);
    System.out.printf("Você quer calcular o fatorial de que número maior que zero?\n");      
    int num = ler.nextInt();
    
    int fat = 1;
    for(int n = 1; n <= num; n++){
        fat = fat*n;
    }
    System.out.printf("O fatorial de %d é %d\n", num, fat);
}

Quando calculo o fatorial de 20, obtenho o número negativo -2102132736. Mudei de int para long e assim consegui o resultado certo. Mas aí quando eu quis obter o fatorial de 50, também obtive um número negativo.
Escrevi então um pequeno código em python para calcular fatorial, o que não me apresentou números negativos. Assim, cheguei a conclusão que isso se deve a algum aspecto de Java que eu desconheço.

Algum de vocês poderia me ajudar?

1 curtida

Colocou um L apos a variavel pra indica que vai ser um long ?

Na Realidade os tipos de dados tem um tamanho correspondente. e os numero do fatorial de 50 excedem a quantidade de numeros que determinado tipo suporta, com isto torna o negativo pois a perda de precisão.

1 curtida

O problema é que cada tipo primitivo java possui um valor máximo que pode armazenar. Vc pode ver os valores para cada tipo aqui.

O fatorial de 20 resulta no valor 2432902008176640000, portanto, maior do que um int por armazenar.
O fatorial de 50 resulta em 30414093201713378043612608166064768844377641568960512000000000000. Talvez seu algoritmo funcione usando um double como tipo primitivo

2 curtidas

Realmente, com o tipo double o problema foi resolvido. Obrigado pela ajuda pessoal!