Newsgroup: it.comp.java
Titolo: cambio dollari-euro

so che sembra veramente stupido chiedere aiuto per questa console di tre
righe ma non ci ho capito un...niente!
devo realizzare un programma che data per cambiare da dollari a euro,
sapendo che 1 dollaro=0.90 euro.
I dollari li so già in partenza=3550 e non devo nemmeno chiedere un input
all'utente.guardate il programma sintetizzato in 2 righe:
int importoDollari=3550;   //la dichiaro int,tanto non cambia nell'esecuz
del  
                              programma,no?
float cambio=0.90,importoEuro;   //li dichiaro float perchè hanno la
virgola.
                                   perchè però float non va bene e mi da 
                                   errore e invece con double compila?
importoEuro=importoDollari/cambio   //così va bene ma mi segna un risultato
                                      con tante cifre decimali.Quindi ho 
                                      provato a dichiarare importoEuro
intero,
                                   ho provato a mettere tra parentesi (int)
                                   prima di importoDollari in questa
stessa 
                                   istruzione ma il risultato ha un bel 
                                   numeretto di cifre comunque dopo la
virgola
Perché?mi spieghereste gentilmente tutte queste cose?lo so,è un programma
facilissimo,è una misera istruzione ma non riesco a fare nemmeno quella.
grazie 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 importoEuro=importoDollari/cambio
Intanto ti consiglierei di utilizzare double anzichè float.
Entrambi sono in virgola mobile, ma i double sono in precisione doppia e ti 
danno maggiore affidabilità nei conti. Visto anche che stai lavorando con 
delle valute monetarie.
Inoltre io uniformerei tutte le variabili a double, oppure farei un bel cast 
sull'int:
int importoDollari = 3550;
double cambio = 0.90, importoEuro;
importoEuro = (double)importoDollari / cambio;
Il discorso del risultato è legato al fatto che il numero è in virgola 
mobile e ti visualizza tutte le cifre decimali.
Devi usare le apposite classi per formattare il valore come pare a te. Ad 
esempio NumberFormat e le sue sottoclassi.
Ciao
Marco 

 esempio NumberFormat e le sue sottoclassi.
Ciao,
        Claudio

 precisione :-)
In effetti sarebbe meglio.
Ciao
Marco 

 precisione :-)
e se io usassi float sbaglio?
dopotutto la parte importante arriva fino a 2 cifre decimali, quindi non e' 
inutile usare double oppure BigDecimal? 

 e se io usassi float sbaglio?
Per un esercizietto float va benissimo. Per la vita quando servono conti
esatti ci vuole effettivamente qualcosa di più preciso dei tipi primitivi.
Devi riflettere sul fatto che la "seconda cifra dopo la virgola" per te è
decimale, e quindi ha una certa capacità di rappresentazione. Mentre in
binario le cose cambiamo molto:
0,1 binario = 1/2 decimale
0,01 = 1/4 (ben diverso da 1/100)
0.001 = 1/8
e così via. Ad esempio 0,1 decimale in binario è periodico e non può essere
rappresentato con un numero finito di cifre dopo la virgola (capito?
Nemmeno con un double!).
Una cosa tipica dei float è che quando ti aspetteresti 0 quelli valgono
0,000000000000000000001 o  e se fai un test tipo numero == 0 ti viene false
anche se non "dovrebbe".
-- 
chi sono e soprattutto chi non sono:
http://www.softeaware.it

> In effetti sarebbe meglio.
no bhe,ma ancora non conosco la classe math.A dire il vero la conosco ma
nell'esercizio non posso,prevedeva soltanto il metodo che ho usato io con
le dovute correzioni alla mia schifezza di codice.
ciao


 anche se non "dovrebbe".
bhe,quello senza dubbio!


import javax.swing.*;
public class Cambio {
    public static void main (String args[]){
        int importoDollari=3550;
        double cambio=0.9, importoEuro;
        importoEuro=importoDollari/cambio;
        JOptionPane.showMessageDialog(null,"il turista ha prelevato
"+importoEuro+" €");
    }
}
come posso fare per far in modo che le cifre dopo la virgola della
variabile importo euro siano troncate?vorrei un risultato tondo, non
3434,44444444444444343434343!
Non ha molto senso che uno riceva 3434,4444444444554324 euro non troviate?



So perfettamente che non devo confrontare a quel modo i numeri in virgola 
mobile.
Io mi faccio i miei calcoli in memoria, se anche lo 0 viene rappresntato 
nell'equivalmente di 0.00000001 decimale non mi interessa. Poi quando 
visualizzo uso un formato a 2 cifre arrotondato quindi sono apposto.
Non vedo proprio come con questo tipo di discrepanze si possa arrivare ad 
intaccare la seconda cifra decimale con un float, a meno che non faccio 2000 
calcoli, cosa che in un progrmma normale non dovrebbe succedere.
Poi pensavo tanto i numeri devi passarli spesso al db, e quando li tiri su 
con una select parti di nuovo dai float...quindi ti trovi sempre lo stesso 
problema.
O no? spiegatemi perche' sto pensando cambiare tutti i float del sito che ho 
fatto a questo punto! 

 ho fatto a questo punto!
Se cambiare o non cambiare questo devi vederlo tu: se il numero (float) lo
usi con significato di calcolo in virgola mobile allora non cambiarlo; se
il numero è un importo allora utilizza java.math.BigDecimal.
Nota: pratica applicata e testata in circa 30+ web app complesse realizzate
dal mio gruppo di lavoro :-)
Ave,
        caius

Non ha molto senso che uno riceva 3434,4444444444554324 euro non troviate?
dai un'occhiata alla classe DecimalFormat :) 

 il numero è un importo allora utilizza java.math.BigDecimal.
Beh il mio sito e' un sito per la vendita di prodotti, quindi ci sono i 
prezzi degli articoli, c'e' un carrello della spesa, ci sono gli ordini con 
i totali ecc.
Calcoli ci sono ma sono per lo piu' somme di prodotti molto semplici per 
calcolare i totali o i prezzi*quantita' nel carrello della spesa.
Da quello che ho capito dovrei passare a BigDecimal, giusto? 

Loganino ha scritto:



non devo usarla,non posso usare altri metodi o classi per risolvere
l'esercizio,solo variabili e il calcolo matematico per il cambio (che in
questo è anche sbagliato, infatti si farebbe importoDollari*cambio).
Cmq la mia idea era quella di dichiarare in importoEuro,ma non funzia.Come
faresti?


 questo č anche sbagliato, infatti si farebbe importoDollari*cambio).
Allora fai cosě.
Utilizza tutti int, scalati di 100.
Ossia, moltiplichi tutto per 100, fai la divisione e ridividi per 100.
    int dollari = 3550 * 100 * 100;
    int cambio  = 0.9 * 100;
    int euro = dollari / cambio;
    double value = euro / 100.0;
    System.out.println("Value = " + value);
Ciao
Marco 

 Marco
anche quello č un metodo!una bella furbata!
Cmq,ritornando al discorso di prima, come mai mi da errore, nei casi che
elenco qui sotto?poi io per programmare uso blue-j, ma ho anche
netbeans.sono equivalenti o uno č meglio dell'altro?
ecco la serie di errori che non capisco:
-float cambio=0.9;    in questo caso mi dice possible loss of precision
-Se faccio una operazione tipo una divisione, posso fare int/double o
double/int? e se non posso mi tocca fare una divisione del tipo
double/double giusto?ma se in quest'ultimo caso volessi il risultatio
int,ciň č possibile mettendo tra parentesi (int) prima di eseguire
l'operazione?facendo cosě a me non compila...
ciao


 intaccare la seconda cifra decimale con un float
Te lo mostro subito con un esempio tratto dal noto  "Effective Java":
Supponi di avere un euro e di trovarti in un negozio di dolci con delle
caramelle da 10, 20, 30 ...ecc. centesimi. Le compri una ad una finché puoi
permettertelo. Quante ne puoi comprare, e quanto resto avrai?
double fondi = 1.00;
int comprate = 0;
for( double prezzo = 0.10; fondi >= prezzo; prezzo +=0.1) {
  fondi -= prezzo;
  comprati++;
}
L'output direbbe che ne puoi comprare 3 e che hai 0.3999999999999 euro di
resto. Quando la realtà è chiaramente che ne puoi comprare 4.
E tra 3 e 4 (come tra 0 e 0.40) la differenza è ben più della seconda cifra
decimale e l'hai ottenuta con poche operazioni. 
Ma poi scusa ti stai facendo un sito di ecommerce ex novo? Non ce ne saranno
già centomila ipertestati e più sicuri da usare?


 già centomila ipertestati e più sicuri da usare?
Si, ma il database e' importato da un gestionale, e si fa prima a farlo ex 
novo anche per i requisiti che mi sono stati imposti. Poi l'ho finito 
quindi... 

 ciao
[..]
io avrei risolto cosi'..
importoEuro = (int)(importoEuro*100);
importoEuro /= 100;
per le tue domande ti rispondo da non esperto perche' sto' studiando java da
poco..
possible loss of precision lo ottieni quando stai cercando di memorizzare in
una variabile di un certo tipo un valore non adatto..
ie. un double in un int
ie. la divisione di due int che generano un valore non int
ie. valori di variabili piu' piccole di un int poiche' vengono estese alla
lunghezza di un int
per la seconda domanda dovresti definire meglio "prima di eseguire
l'operazione"..
--