Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347

    [Java] Errori nelle operazioni tra double

    sto riscontrando degli errori in alcune operazioni effettuate dal mio programma, questo deve effettuare delle addizioni e visualizzarle su una gui ma vengono effettuate in modo errato, ad esempio dovrebbe incrementare un valore ogni volta di 1.2.... partendo da 0, alla prima ritorna 1.2, poi 2.4 e poi 3.5999999999999996 forse è una cosa comune? XD come mai succede questo? non ho postato il codice perchè quello che faccio è una semplice addizione, ma se è necessario lo posto

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Evidentemente non arrotonda a 3,6. Arrotondalo tramite Math.round(). http://docs.oracle.com/javase/7/docs...lang/Math.html

    Se lo mostri a video puoi anche mostrare solo i decimali che vuoi dopo alla virgola, devo solo formattarlo. ^^

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    evidentemente sono io che non arrotondo XD però non capisco perchè sbagli un'operazione semplice come 2.4 + 1.2, non dovrebbe essere necessario arrotondare perchè l'operazione è elementare...
    EDIT: usando round mi elimina del tutto la cifra decimale!! XD

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Originariamente inviato da John360
    evidentemente sono io che non arrotondo XD però non capisco perchè sbagli un'operazione semplice come 2.4 + 1.2, non dovrebbe essere necessario arrotondare perchè l'operazione è elementare...
    EDIT: usando round mi elimina del tutto la cifra decimale!! XD
    Sono i problemi derivanti dalla virgola mobile e numeri periodici..se cerchi sul forum ci sono tante altre domande molto simili alle quali (Andbin mi sembra) hanno dato una risposta molto più dettagliata

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    pensavo che problemi del genere non sorgessero nel caso operazioni tanto elementari! comunque ok provo a cercare sul forum!

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da John360
    pensavo che problemi del genere non sorgessero nel caso operazioni tanto elementari! comunque ok provo a cercare sul forum!
    Forse tu le reputi operazioni elementari perché quei numeri ti sembrano "semplici", avendo una sola cifra decimale; in realtà la loro rappresentazione è semplice solo in base 10, lo stesso numero può avere rappresentazioni molto diverse a seconda della base, addirittura può passare dall'essere finito all'essere periodico. E i calcoli vengono fatti in binario, con tutto ciò che ne consegue, prova a convertire 1.2 in binario:
    http://www.mathsisfun.com/binary-dec...converter.html

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    si lo so come vengono fatte le operazioni sulla macchina, e al corso abbiamo pure studiato come effettuare le operazioni con numeri in base2, anzi aggiungerei che non è una singola operazione ma sulla macchina avviene qualcosa del genere:
    LOAD A
    ADD B
    STORE A
    lo so che non è un'operazione semplice, ma io parlavo in modo relativo...
    Comunque non è che qualcuno potrebbe darmi una mano? non riesco a trovare questa discussione di cui parlavamo prima, quella a cui avrebbe risposto andbin

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Pardon, credevo che la domanda fosse "perché" e non "come lo evito".

    Originariamente inviato da John360
    si lo so come vengono fatte le operazioni sulla macchina, e al corso abbiamo pure studiato come effettuare le operazioni con numeri in base2, anzi aggiungerei che non è una singola operazione ma sulla macchina avviene qualcosa del genere:
    LOAD A
    ADD B
    STORE A
    lo so che non è un'operazione semplice, ma io parlavo in modo relativo...
    Comunque non è che qualcuno potrebbe darmi una mano? non riesco a trovare questa discussione di cui parlavamo prima, quella a cui avrebbe risposto andbin
    Usa BigDecimal invece di double, col metodo setScale puoi specificare il numero di cifre desiderate nella parte frazionaria ed il criterio di arrotondamento, ed eventualmente ottenere il relativo double col metodo doubleValue.

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    il problema non è la scala, più che altro il fatto che non esegue correttamente le operazioni... usando un BigDecimal si corregge questo errore?

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Prova ad eseguire questo semplicissimo programma e ti renderai facilmente conto che non tutti i numeri sono "rappresentabili perfettamente" usando lo standard IEEE 754 (lo standard che descrive il modo di rappresentazione dei numeri in virgola mobile).

    codice:
    public class Numeri {
       public static void main(String[] args) {
          double d = 1.1d;
          for(int i=0; i<10; i++) {
             System.out.println(d + (i/10.0d));
          }
       }
    }
    Se lo standard permettesse la rappresentazione perfetta, questo programma stamperebbe questo output:
    codice:
    1.1
    1.2
    1.3
    1.4
    1.5
    1.6
    1.7
    1.8
    1.9
    2.0
    Noterai facilmente che proprio il valore 1.2 non è rappresentabile tramite tale standard poichè il valore 0.1 non è egli stesso rappresentabile (è possibile, effettivamente, prendere il valore 1.0 e sommarlo al valore 0.2 ed ottenere con precisione il valore 1.2).

    Una descrizione un po' più dettagliata dello standard la trovi qui:

    http://it.wikipedia.org/wiki/Numero_in_virgola_mobile
    http://it.wikipedia.org/wiki/IEEE_754


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.