Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071

    [JAVA] Errore BigDecimal

    ciao a tutti... ho un codice... nessun errore in fase di compilazione... però quando lo faccio partire mi dice "Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result."

    dichiarando "probabilità" come un double non mi da nessun problema... facendo questa modifica e poi inserendo gli stessi valori (ad esempio 10 e 2) mi da il problema

    codice:
    import java.util.Scanner;
    import java.math.*;
    
    
    public class ProbabilitaBigDecimal{
    	public static void main(String[] args){
    		Scanner input = new Scanner(System.in);
    
    		System.out.print("Range di valori da estrarre: 0 - ");		
    		int valMax = input.nextInt();
    		
    		System.out.print("Inserire il numero di valori da indovinare: ");
    		int n = input.nextInt();
    
    		BigDecimal probabilita = BigDecimal.valueOf(1);
    		for (int i = 1; i <= n; i++)
    			probabilita = probabilita.multiply(BigDecimal.valueOf(valMax - i + 1)).divide(BigDecimal.valueOf(i));
    		
    		probabilita = BigDecimal.valueOf(1).divide(probabilita);
    	
            	System.out.print("\nLa tua probabilita' di indovinare e' del " + probabilita + "%");
    	}
    }

    Spero che possiate essermi d'aiuto... grazie

  2. #2
    Ciao,
    come ti dice il messaggio dell'eccezione, il problema è legato al fatto che il risultato dell'operazione di divisione:

    codice:
    probabilita = BigDecimal.valueOf(1).divide(probabilita);
    non ha una rappresentazione esatta con un numero decimale. Questo dipende dal particolare valore di probabilità; ad esempio con 2 non ti dà problemi, perché 1/2=0.5, mentre con 3 te li dà perché 1/3=0.33333... con infinite cifre decimali.
    Per evitare l'eccezione devi specificare con che precisione vuoi ottenere il risultato quando effettui la divisione; se non la specifichi, di default è infinita e quindi hai l'eccezione. Nella classe MathContext sono definite delle costanti (DECIMAL128, DECIMAL64, DECIMAL32) che ti permettono di indicare la precisione voluta; ad esempio:

    codice:
    probabilita = BigDecimal.valueOf(1).divide(probabilita, MathContext.DECIMAL128);
    Per il significato delle costanti puoi consultare il javadoc della classe MathContext.

    Ciao,

  3. #3
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    Grazie.. finalmente va

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.