Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete implementa due bracci estensibili, per spazzola e moccio, che si spingono ben oltre quanto visto sino ad oggi permettendo una pulizia di casa ancor più capillare e precisa
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
La tecnologia SQD-Mini LED di TCL arriva sul taglio da 65 pollici con la serie C8L: 2040 zone, pannello WHVA 2.0 e un picco che alle rilevazioni delle sonde tocca i 4400 nit nel profilo Filmmaker e un HDR quasi perfetto
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro
Wireless 2.4 GHz, Bluetooth 5.4, cancellazione attiva del rumore, design pieghevole e un'autonomia che mette in imbarazzo prodotti che costano il doppio. Le Maestro 500 non eccellono in nulla, ma offrono tutto. E a questo prezzo è difficile chiedere di più
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-05-2007, 13:05   #1
hello
Senior Member
 
Iscritto dal: Jul 2005
Messaggi: 584
java come non troncare numeri

leggendo dei numeri da un file e convertendoli in double usando num = Double.parseDouble(linea); ho notato che quando li stampo questi non sono uguali ad esempio
-0.01976446502439700405
diventa
-0.0197644650243970040

oppure
4512014.1482265731234567890
diventa
4512014.148226573


come posso risolvere, mi servono come numeri senza essere troncati perchè poi devo sommarli/sottrarli???

hello è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2007, 13:17   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Usa BigDecimal

Per le operazioni ha dei metodi al posto degli operatori. Sono immutable quindi i metodi-operatori non alterano il valore dell'istanza ma restituiscono nuovi BigDecimal che contengono il risultato. A parte questo sono una gioia .
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2007, 18:05   #3
hello
Senior Member
 
Iscritto dal: Jul 2005
Messaggi: 584
grazie!!! ho provato ma ho alcuni problemi, ecco il codice:

import java.math.BigDecimal;

public class Grandi {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("6666665.2222222224");
BigDecimal num2 = new BigDecimal("2222223.2222222224");
BigDecimal num3 = new BigDecimal("1234567.0987654321");
BigDecimal num4 = new BigDecimal("2.0");
System.out.println("num1 = " +num1);
System.out.println("num2 = " +num2);

BigDecimal somma = num1.add(num2);
System.out.println("somma = " +somma);

BigDecimal moltiplica = num1.multiply(num2);
System.out.println("moltiplicazione = " +moltiplica);

BigDecimal divisione_1 = somma.divide(num4);
System.out.println("divisione_1 = " +divisione_1);

BigDecimal test = moltiplica;
System.out.println("test deve essere uguale a moltiplica = " +test);

BigDecimal divisione_2 = num1.divide(num2);
System.out.println("divisione_2 = " +divisione_2);
}
}

ho questo errore:
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1513)
at Grandi.main(Grandi.java:24)


inoltre se volessi fare (num1+num2+test )/3 come dovrei fare ???

grazie
hello è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2007, 18:19   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Se dividi allora devi specificare un tipo di arrotondamento perchè il meccanismo predefinito è ultra-conservativo: se non può calcolare un risultato esatto allora spara un'eccezione.

C'è un metodo ad hoc in BigDecimal, il divide che accetta un RoundingMode. In pratica anzichè:

BigDecimal r = a.divide(b);

fai

BigDecimal r = a.divide(b, RoundingMode.HALF_EVEN);

O un altro RoundingMode, devi vedere tu qual'è il più adatto.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2007, 18:57   #5
hello
Senior Member
 
Iscritto dal: Jul 2005
Messaggi: 584
ho provato con
BigDecimal divisione_2 = num1.divide(num2, BigDecimal.ROUND_HALF_UP);
che ha arrotondato il risultato a 3 senza avere nessuna eccezione

ma per fare (num1+num2+test+ ...)/3 come dovrei fare perchè tutti gli esempi che ho trovato fanno sempre operazioni soltanto tra due valori, inoltre posso dividere direttamente per 3 oppure questo dovrà essere inizializzato in qualche altra variabile. grazie mille!!!
hello è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2007, 19:45   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Supponendo che a, b, c e d siano BigDecimal dirai:

BigDecimal r = a.add(b).add(c).divide(d, RoundingMode.HALF_EVEN);

che tradotto in simboli sarebbe:

(a + b + c) / d
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2007, 20:42   #7
hello
Senior Member
 
Iscritto dal: Jul 2005
Messaggi: 584
grazie!!!
hello è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2007, 19:39   #8
hello
Senior Member
 
Iscritto dal: Jul 2005
Messaggi: 584
se a, b, c sono BigDecimal e vorrei dividerli per 3

posso fare soltanto così:

BigDecimal tre_ = new BigDecimal("3");
BigDecimal risultato = a.add(b).add(c).divide(tre_, RoundingMode.HALF_EVEN);


cioè non c'è un modo più veloce, tipo come per i float
float a=1;
float b=2;
float tot=(a+b)/2;
System.out.println(tot);

hello è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2007, 19:55   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da hello Guarda i messaggi
cioè non c'è un modo più veloce, tipo come per i float
No ... i metodi sono quelli!

Per costruire BigDecimal con valori predefiniti (costanti), parti da un int/long/double, non da una stringa (se vai a vedere BigDecimal ha una caterva di costruttori!)
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2007, 21:15   #10
hello
Senior Member
 
Iscritto dal: Jul 2005
Messaggi: 584
se faccio così e corretto

import java.math.BigDecimal;

public class Prova {
public static void main(String[] args) {
int i = 8;
BigDecimal bd = new BigDecimal(String.valueOf(i));

System.out.println(bd);
}
}
hello è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2007, 21:19   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da hello Guarda i messaggi
int i = 8;
BigDecimal bd = new BigDecimal(String.valueOf(i));
Non fai prima con new BigDecimal(8) (con Java 5), altrimenti new BigDecimal(8.0)???
Ma sei andato a vedere i costruttori di BigDecimal???
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2007, 21:43   #12
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Usa sempre il costruttore che richiede una stringa e sei a posto.

BigDecimal bd = new BigDecimal("1");
BigDecimal bg = new BigDecimal("9.0");

eccetera.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2007, 21:43   #13
hello
Senior Member
 
Iscritto dal: Jul 2005
Messaggi: 584
Quote:
Originariamente inviato da andbin Guarda i messaggi
Non fai prima con new BigDecimal(8) (con Java 5), altrimenti new BigDecimal(8.0)???
Ma sei andato a vedere i costruttori di BigDecimal???
no scusa, avevo cercato qualche esempio sulla rete

ma
BigDecimal bd = new BigDecimal("8");
BigDecimal bd = new BigDecimal(8);
int i=8;
BigDecimal bd = new BigDecimal(String.valueOf(i));
è la stessa cosa oppure no?

puoi suggerirmi un link per lo studio dei costruttori?

grazie
hello è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2007, 21:51   #14
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da hello Guarda i messaggi
ma
BigDecimal bd = new BigDecimal("8");
BigDecimal bd = new BigDecimal(8);
int i=8;
BigDecimal bd = new BigDecimal(String.valueOf(i));
è la stessa cosa oppure no?
Nel primo caso usi il costruttore di BigDecimal che prende un String, nel secondo caso quello che prende un int (Java 5) e nel terzo caso come il primo solo che prima da un intero ottieni una stringa e poi la passi a BigDecimal (inutile quindi).

Quote:
Originariamente inviato da hello Guarda i messaggi
puoi suggerirmi un link per lo studio dei costruttori?
Sui concetti relativi ai costruttori?? Qualunque buon libro o tutorial online!
http://www.google.it/search?hl=it&q=...n+Google&meta=
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2007, 21:55   #15
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Per valori interi l'uso di un primitivo (byte, short, int, long) o di una stringa è uguale.

Per valori che hanno una parte frazionaria (float, double) l'uso di un valore double o float, sia esso una variabile piuttosto che un letterale, è problematico perchè BigDecimal assume l'esatto valore del numero che gli passi. Tale valore può non corrispondere a quello espresso dal letterale numerico.

BigDecimal(8.1)

è all'incirca 8.1 mentre

BigDecimal("8.1") è esattamente 8.1.

Considera inoltre l'ovvio rilievo che inizializzare un numero a precisione arbitraria con un valore a precisione limitata è un caso non banale di schizofrenia :
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2007, 22:04   #16
hello
Senior Member
 
Iscritto dal: Jul 2005
Messaggi: 584
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Considera inoltre l'ovvio rilievo che inizializzare un numero a precisione arbitraria con un valore a precisione limitata è un caso non banale di schizofrenia :
cosa vuol dire inizializzare un numero a precisione arbitraria con un valore a precisione limitata ? mi fai un esempio?
hello è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2007, 22:30   #17
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Era una facezia. Ammazza, tutti allegri eh?

Un double ha 16 cifre significative. Prendi il numero:

4512014.1482265731234567890

e conta fino a 16, a partire da sinistra (la prima cifra diversa da zero). Quello è il double.

4512014.148226573

il resto

1234567890

è fuffa.

Puoi dire:

double x = 4512014.1482265731234567890;
BigDecimal v = new BigDecimal(x);

ma è "schizofrenico" perchè tra il valore di x e il valore di v non c'è differenza, dal punto di vista della coincidenza tra il letterale scritto (4512014.1482265731234567890) ed il valore assunto. Solo 16 cifre del double sono significative: le altre sai già (perchè hai usato un double) che non saranno rappresentate correttamente.

E' la stringa il pane del BigDecimal. Perchè è coerente con l'intenzione. Io voglio un numero che vale esattamente questo: e vomiti un improperio di cifre. E' ok, BigDecimal serve (anche) a quello: a prescindere dal numero di cifre che scrivi sai già che tutto il numero che hai scritto sarà rappresentato, che ogni cifra sarà correttamente assunta perchè la precisione di un BigDecimal è arbitraria.

Perchè tu hai chiesto di BigDecimal? Be', perchè vuoi che un numero con una quantità arbitraria di cifre sia correttamente rappresentato e double non può farlo. Se mi usi un double per inizializzare il BigDecimal siamo punto e a capo .
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!

Ultima modifica di PGI-Bis : 14-05-2007 alle 22:31. Motivo: ehh, scrivere. Mica facile.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2007, 00:07   #18
hello
Senior Member
 
Iscritto dal: Jul 2005
Messaggi: 584
grazie per la spiegazione!!!
hello è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2007, 23:56   #19
hello
Senior Member
 
Iscritto dal: Jul 2005
Messaggi: 584
ma se faccio 3/2 con i BigDecimal come faccio ad ottenere 1.5

perchè se faccio così arrotonda a 1 oppure a 2:

BigDecimal num1 = new BigDecimal("3");
BigDecimal num2 = new BigDecimal("2");
BigDecimal divisione_1 = num1.divide(num2, BigDecimal.ROUND_UP);
BigDecimal divisione_2 = num1.divide(num2, BigDecimal.ROUND_DOWN);

hello è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2007, 10:50   #20
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Devi specificare quante cifre dopo la virgola vuoi che siano rappresentate. Puoi farlo in costruzione (con la stringa):

BigDecimal num1 = new BigDecimal("3.0"); //1 cifra dopo la virgola

o con il metodo setScale, che restituisce un nuovo BigDecimal:

BigDecimal num1 = new BigDecimal("3").setScale(1); //1 cifra dopo la virgola
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati TCL 65C8L, la recensione del SQD-Mini LED da 440...
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro MSI Maestro 500 Wireless: ANC e 90 ore di autono...
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con ...
La PS6 si farà attendere: il lanc...
OnePlus non sente la crisi delle memorie...
I futuri iPhone 18 Pro potrebbero costar...
Bosch eBike Systems MY2027: a sorpresa a...
Amazon, le top 5 offerte del weekend per...
Sesto giorno di Prime Day anticipato Ama...
La scopa elettrica Roborock F25 Ultra sc...
Ho messo uno studio video con Intelligen...
Dreame Aqua10 Ultra Roller Complete punt...
Roborock Saros 20 Set sembra fuori categ...
Samsung Galaxy Z Fold 8: prezzi in salit...
NVIDIA mostra una comunità di rob...
Sony annuncia LYTIA L910, arriva il sens...
Ericsson, il 5G è l’infrastruttur...
Marvell punta tutto su TSMC A14: sar&agr...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:42.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v