Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
A New York HP ha messo al centro della scena HP IQ, la piattaforma di IA locale da 20 miliardi di parametri. L’abbiamo vista in funzione: è uno strumento che funziona, pensato per un target specifico, con vantaggi reali e limiti altrettanto evidenti
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
La PNY GeForce RTX 5080 Slim OC si distingue nel panorama delle GPU di fascia alta per il design compatto a due slot, ispirato alla NVIDIA GeForce RTX 5080 Founders Edition. In questo test analizziamo comportamento termico e prestazioni in gioco, valutando se il formato ridotto comprometta o meno l'esperienza complessiva rispetto alle soluzioni più ingombranti presenti sul mercato.
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
HUAWEI WiFi Mesh X3 Pro Suite è probabilmente il router mesh più fotogenico che si possa acquistare oggi in Italia, ma dietro il guscio in acrilico trasparente e le luci LED dinamiche c'è una macchina tecnica costruita attorno allo standard Wi-Fi 7, con velocità teoriche Dual-Band fino a 3,6 Gbps e una copertura fino a 120 m² una volta abbinato il router principale all'extender incluso nel kit
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
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
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
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
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
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
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


HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
iPhone 18, il mistero sul destino della ...
Motorola lavora al nuovo Razr 70 Ultra: ...
Il programma di ridimensionamento di One...
L'industria statunitense non è co...
La NASA cambia strategia per le missioni...
Mike Fincke, l'astronauta che ha avuto u...
I Meta Ray-Ban Display potrebbero non ar...
La serie di God of War ha trovato l'attr...
Il nuovo iPhone Fold si farà atte...
Ex CEO di Intel furioso verso Wall Stree...
Un foglietto di rame e le prestazioni di...
100 agenti AI per dipendente: quello che...
Le 10 migliori offerte del weekend Amazo...
75'' e 85'' QD-Mini LED: 2 TV interessan...
Offerte Amazon sui componenti hardware P...
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: 11:20.


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