Newsgroup: it.comp.java
Titolo: 1.2*3=3.5555559 ?????????????

ma come è possibile?
se prendo 2 variabili double e gli dò per esempio questi valori esce nella
moltiplicazione il risultato sopra!
come si può fare se ho
double op1=(qualcosa);
double op2=(qualcosa);
double ris=op1/op2;
grazie per gli eventuali suggerimenti!


Semplicemente xche' la precisione dei float non consente un risultato
diverso...
in generale (1.2*3)/3 non fara' mai 1.2 ma 1.2 +o- un certo epsilon
in java non ti so dire dove trovarle ma in ogni linguaggio esistono
delle costanti che contengono proprio un valore per simulare il +o-
epsilon che potra' essere usato quando effettui confronti con dei
float.
Ovviamente esistono dei metodi per ottenere una precisione molto
elevata la necessita' di usarli dipende molto da che tipo di
applicazione dovrai implementare...
Ciao, 
Maurizio

 ha scritto nel messaggio
news:ApMBa.31086$g92.6...@news2.tin.it...

Le operazioni con i double danno sempre risultati strani! :(
Il problema e' che con un double non puo' rappresentare in maniera precisa
qualsiasi numero (questo lo si riesce a capire meglio se si studia come
funzionano i floating point...); l'unica cosa che ti posso consigliare e' di
arrotondare, ogni tanto, il risultato o, magari, di utilizzare un altro tipo
di dato.
Per esempio, dai un'occhiata al seguente codice:
import java.math.BigDecimal;
public class Prova {
    public Prova() {
    }
    public static strictfp void main(String[] args) {
        double op1 = 1.2d;
        double op2 = 3d;
        System.out.println("double*double=" + (op1*op2));
        BigDecimal d1 = new BigDecimal(1.2);
        BigDecimal d2 = new BigDecimal(3);
        System.out.println("BigDecimal*BigDecimal=" + (d1.multiply(d2)));
        System.out.println("BigDecimal*BigDecimal arrotondati=" +
d1.multiply(d2).setScale(10,BigDecimal.ROUND_HALF_DOWN));
    }
}
Il risultato e':
double*double=3.5999999999999996
BigDecimal*BigDecimal=3.5999999999999998667732370449812151491641998291015625
BigDecimal*BigDecimal arrotondati=3.6000000000
Spero che ti sia utile.
Ciao,
Luigi
p.s.:
Giusto per curiosita', ho provato anche con 
VB.NET
, utilizzando il tipo
double:
double*double= 3,6
Cosi', tanto per innescare una bomba di polemiche... :))))

 ha scritto nel messaggio
news:1qNBa.47295$Ny5.1...@twister2.libero.it...
[cut]

a mio avviso il modo corretto di usare i BigDecimal non e'
quello di convertire i double, perche' ti trascini i problemi,
ma direttamente le stringhe. quindi modificherei il tuo esempio cosi':
import java.math.BigDecimal;
public class Prova  {
  public Prova() {
  }
  public static strictfp void main(String[] args) {
    double op1 = 1.2d;
    double op2 = 3d;
    System.out.println("double*double=" + (op1 * op2));
    BigDecimal d1 = new BigDecimal("1.2");
    BigDecimal d2 = new BigDecimal("3");
    System.out.println("BigDecimal*BigDecimal=" + (d1.multiply(d2)));
  }
}
otterrai:
  double*double=3.5999999999999996
  BigDecimal*BigDecimal=3.6
senza bisogno di arrotondamenti.
bye
R

 ha scritto nel messaggio
news:z1OBa.31931$g92.6...@news2.tin.it...


 ha scritto nel messaggio
news:XkOBa.32051$g92.6...@news2.tin.it...


 ha scritto nel messaggio
news:z1OBa.31931$g92.6...@news2.tin.it...

Grazie!
Ciao,
Luigi