Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Perchè le variabili double fanno questi scherzetti?

    codice:
    double r = 1/2;
    System.out.println(r);
    Perchè dal frammento di questo codice, il risultato che visualizzo sullo schermo è: 0.0?? o_O

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Perchè le variabili double fanno questi scherzetti?

    Originariamente inviato da Dreamer89
    codice:
    double r = 1/2;
    System.out.println(r);
    Perchè dal frammento di questo codice, il risultato che visualizzo sullo schermo è: 0.0?? o_O
    1 è una costante intera, 2 è una costante intera. Ne deriva che la divisione è "intera", non floating-point.

    Se fosse stato ad esempio:

    double r = 1.0/2;
    o
    double r = (double) 1/2;

    Allora nel caso sopra 1.0 è una costante double mentre nel caso sotto il 1 intero viene convertito a double prima della divisione.

    L'altro operando (il 2 intero) sarebbe stato convertito automaticamente a double e la divisione sarebbe stata fatta in floating-point, dando come risultato 0.5.

    Rivedi le Conversions and Promotions in particolare la "Binary Numeric Promotion", perché sono fondamentali.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: Perchè le variabili double fanno questi scherzetti?

    Originariamente inviato da andbin
    1 è una costante intera, 2 è una costante intera. Ne deriva che la divisione è "intera", non floating-point.

    Se fosse stato ad esempio:

    double r = 1.0/2;
    o
    double r = (double) 1/2;

    Allora nel caso sopra 1.0 è una costante double mentre nel caso sotto il 1 intero viene convertito a double prima della divisione.

    L'altro operando (il 2 intero) sarebbe stato convertito automaticamente a double e la divisione sarebbe stata fatta in floating-point, dando come risultato 0.5.

    Rivedi le Conversions and Promotions in particolare la "Binary Numeric Promotion", perché sono fondamentali.
    Perfetto grazie mille ^^

  4. #4
    Approfitto del topic per domanda un'altra cosa, questo è il codice:
    codice:
    		double r = 5.6;
    		double w = 0.1;
    		System.out.println(r+w);
    Perchè sullo schermo mi appare 5,699999999999 invece di 5,7? o_O

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Dreamer89
    Approfitto del topic per domanda un'altra cosa, questo è il codice:
    codice:
    		double r = 5.6;
    		double w = 0.1;
    		System.out.println(r+w);
    Perchè sullo schermo mi appare 5,699999999999 invece di 5,7? o_O
    L'utilizzo di numeri floating-point pone diverse questioni spinose e noiose (e non posso spiegarle tutte in un post).

    Si parte dal presupposto che non tutti i numeri "reali" possono essere rappresentati in modo perfetto con valori floating-point su un numero limitato di bit. 0,75 può essere rappresentato in modo perfetto. 0,8 no e nemmeno 5,6 oppure 0.1. Questi ultimi tre saranno molto molto vicini al valore che dovrebbero avere ma non potranno mai essere precisamente quel valore su un numero finito e limitato di bit.
    A ciò si aggiungono gli errori introdotti dai calcoli fatti dall'algoritmo che si occupa della formattazione del numero in stringa.

    Per farla breve, per formattare in modo utile un valore floating-point, usa un java.text.NumberFormat oppure usa la nuova funzionalità di formattazione (da Java 5) con format().
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Originariamente inviato da andbin
    L'utilizzo di numeri floating-point pone diverse questioni spinose e noiose (e non posso spiegarle tutte in un post).

    Si parte dal presupposto che non tutti i numeri "reali" possono essere rappresentati in modo perfetto con valori floating-point su un numero limitato di bit. 0,75 può essere rappresentato in modo perfetto. 0,8 no e nemmeno 5,6 oppure 0.1. Questi ultimi tre saranno molto molto vicini al valore che dovrebbero avere ma non potranno mai essere precisamente quel valore su un numero finito e limitato di bit.
    A ciò si aggiungono gli errori introdotti dai calcoli fatti dall'algoritmo che si occupa della formattazione del numero in stringa.

    Per farla breve, per formattare in modo utile un valore floating-point, usa un java.text.NumberFormat oppure usa la nuova funzionalità di formattazione (da Java 5) con format().
    Ho provato con String.format() e il problema viene risolto... però mi sembra così tanto strano un'imprecisione del genere. Bho o_O Grazie mille comunque, sei sempre di grandissimo aiuto ^^

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.