[Java]Approssimazione a 2 cifre decimali

Pubblicità

murder eyes

Nuovo Utente
Messaggi
24
Reazioni
0
Punteggio
25
Chi di voi sa come approssimare un double a due cifre decimali?
Il problema e' sorto perche' facendo sottrazioni e addizioni tra variabili double, vengono fuori numeri con cifre decimali che sembrerebbero fuori dal normale(dovute agli errori di approssimazione della macchina virtuale).

Ho provato a moltiplicare la variabile per 1.00 ma non cambia niente.
 
Qua ci vuole l'intervento di Kamicia :sisi:

PS: Premettendo che non programmo in Java, non puoi fare un cast a float?
 
murder eyes ha detto:
Chi di voi sa come approssimare un double a due cifre decimali?
Il problema e' sorto perche' facendo sottrazioni e addizioni tra variabili double, vengono fuori numeri con cifre decimali che sembrerebbero fuori dal normale(dovute agli errori di approssimazione della macchina virtuale).

Ho provato a moltiplicare la variabile per 1.00 ma non cambia niente.
Usa il famoso algoritmo :D:
Allora premetto, che per il momento non programmo ancora in java, ma l' algoritmo di approsimazione e' soltanto un algoritmo e in quanto tale, si puo' applicare in tutti i linguaggi .. (io l' ho fatto in C ..)
Allora per semplificare ammetiamo che hai un numero decimale alla prima cirfra decimale es. 0.2 oppure 0.7 ... nel nostro programmino la nostra cifra decimale sara' memorizzata come variabile "Decimale". Mentre la cifra intera sara' la variabile "Intero"

if (Decimale + 5 >= 10) {
Intero = Intero +1;
}

N.B. Se non hai fatto C ... spiego: Dentro le parentesi tonde ce' la condizione per la quale l' if si deve avverare per eseguire l' operazione dentro le parentesi graffe.


Ovvero se la cifra decimale diventa maggiore di 10, aggiungendogli 5 .. allora la cifra intera deve essere incerementata di 1, altrimenti viene lascaita com' e'.
Nel tuo caso sostituisci la "Decimale" con la seconda cifra decimale, e "Intero" con la prima cifra decimale. :ok:

Spero di essere stato chiaro :rolleyes:
Se ce' qualche dubbio chiedi pure :)
 
Io la sparo, speriamo non sia una boiata :lol::lol::lol:

Nel caso cancellatemi il messaggio!!! :blush:

Dunque... ma se provassi a fare così: %.2f
Dovresti avere come risultato di visualizzazione un intero con due decimali.

Bene, dopo questa mi cacello dal forum!!! :rolleyes:
 
anagram ha detto:
Io la sparo, speriamo non sia una boiata :lol::lol::lol:

Nel caso cancellatemi il messaggio!!! :blush:

Dunque... ma se provassi a fare così: %.2f
Dovresti avere come risultato di visualizzazione un intero con due decimali.

Bene, dopo questa mi cacello dal forum!!! :rolleyes:

non e' sbagliato ... pero' cosi, semplicemente lo visualizza solo con 2 decimali .. senza modificare o arrotondare la variabile stessa.
Ovvero se poi devi fare delle operazioni con la variabile, questa sara' inalterata, ovvero non arrotondata. :sisi:
Dipende a cosa serve a lui :sisi:
 
Questo codice vale per i numeri positivi:

Codice:
double intero = floor(variabile);
double decimale = 0;

decimale = variabile - intero ;
if (round(decimale * 100) != 0)
{
  decimale = 100 / (round(decimale * 100)); 
  //Se vuoi l'approssimazione a 3 cifre, usa 1000 al posto di 100
}


variabile = intero + decimale;

EDIT: Mi ero dimenticato un controllo :)


Ciao!
 
K.I. ha detto:
Questo codice vale per i numeri positivi:

Codice:
double intero = floor(variabile);
double decimale = 0;

decimale = variabile - intero ;

decimale = 100 / (round(decimale * 100)); //Se vuoi l'approssimazione a 3 cifre, usa 1000 al posto di 100

variabile = intero + decimale;

Ciao!


Ciao!
ma questo e' C ? :boh:
e le funzioni floor e round dove sono scritte ? :boh:
o e' java .. ? .. se e' cosi' allora ritiro tutto ...
 
sono le funzioni di Math di java.

Ciao!

EDIT:

in C, C++ si può usare questa (sempre numeri positivi):

Mi ero dimenticato un controllo :)

Codice:
unsigned long long intero = (unsigned long long) variabile; 
//cast a un numero intero, vine eliminata la parte decimale

double decimale = 0;

decimale = variabile - intero ;
if (round(decimale * 100) != 0)
{
  decimale = 100 / (round(decimale * 100)); 
}
//Se vuoi l'approssimazione a 3 cifre, usa 1000 al posto di 100

variabile = intero + decimale;


Ciao!
 
Non so perché fai tutto sto viaggio...
basterebbe invertire i fattori della divisione e non dovresti fare altro:

Esempio di una funzione in Java per l'approssimazione (valida sia per numeri positivi che negativi) ad un numero di cifre arbitrario:
Codice:
public double arrotonda( double numero, int nCifreDecimali ){
    return Math.round( numero * Math.pow( 10, nCifreDecimali ) )/Math.pow( 10, nCifreDecimali );
}

ciao :ok:
 
Pubblicità
Pubblicità
Indietro
Top