2015-09-29 12 views
31

Esempio: Convert double to floatConvertire doppia a galleggiare in Java

Sto affrontando un problema relativo alla conversione double a float. In realtà, memorizzo un tipo float, 23423424666767, in un database, ma quando otteniamo dati dal database nel codice sottostante, getInfoValueNumeric(), è del tipo double. Il valore che otteniamo è nel modulo 2.3423424666767E13.

Quindi, come si ottiene un dato di formato float come 23423424666767?

2.3423424666767E13 to 23423424666767

public void setInfoValueNumeric(java.lang.Double value) { 
    setValue(4, value); 
} 


@javax.persistence.Column(name = "InfoValueNumeric", precision = 53) 
public java.lang.Double getInfoValueNumeric() { 
    return (java.lang.Double) getValue(4); 
} 

Per saperne di più: Convert double to float in Java

+3

solo gettò double d = 3.0;. galleggiante f = (float) d; –

+0

I numeri sembrano uguali, solo diverse rappresentazioni di sa valore me. – mksteve

+0

Non funziona per me – Sitansu

risposta

95

Basta lanciare la vostra doppia ad un galleggiante.

double d = getInfoValueNumeric(); 
float f = (float)d; 

Si noti inoltre che i tipi primitivi non può memorizzare un insieme infinito di numeri:

float range: from 1.40129846432481707e-45 to 3.40282346638528860e+38 
double range: from 1.7e–308 to 1.7e+308 
+3

Finalmente qualcuno risponde alla domanda effettiva :) + 1 (beh, anche akhil_mittal's) – tokland

+0

Impossibile trasmettere l'errore double to float –

+2

@JimmyKane assicurati di utilizzare i tipi primitivi "float" e "double" e non i tipi di oggetto "Float", "Double". –

13

vi consiglio di recuperare il valore memorizzato nel database come tipo BigDecimal:

BigDecimal number = new BigDecimal("2.3423424666767E13"); 

int myInt = number.intValue(); 
double myDouble = number.doubleValue(); 

// your purpose 
float myFloat = number.floatValue(); 

BigDecimal offre molte funzionalità.

+3

Se qualcuno passa un valore che non è una stringa, si consiglia di utilizzare _BigDecimal.valueOf() _ invece di _new BigDecimal() _. Vedi [https://dev.eclipse.org/sonar/rules/show/squid:S2111](https://dev.eclipse.org/sonar/rules/show/squid:S2111) – River

+0

Buona nota @River ed eccellente uso del link delle regole del sonar. –

+0

Quel vecchio collegamento è morto. Eccone un altro: https://sonar.spring.io/coding_rules#rule_key=squid%3AS2111 – River

3

di rispondere la query su "Come convertire 2.3423424666767E13 a 23.423.424,666767 millions"

è possibile utilizzare un decimal formatter per la formattazione dei numeri decimali.

 double d = 2.3423424666767E13; 
    DecimalFormat decimalFormat = new DecimalFormat("#"); 
    System.out.println(decimalFormat.format(d)); 

uscita: 23423424666767

+3

Questo non converte un valore doppio in float ... Il metodo 'format' restituisce un oggetto String. –

+0

bene dopo la stringa può essere analizzata senza molto sforzo –

+2

È sempre possibile convertire un valore stringa in float da "Float.parseFloat (decimalFormat.format (d))". Sebbene rappresenti ancora il valore con la rappresentazione scientifica come ** 2.34234241E13 **. –

0

Il problema è, vostro valore non può essere immagazzinato con precisione in singola precisione tipo a virgola mobile. Dimostrazione:

public class test{ 
    public static void main(String[] args){ 
     Float a = Float.valueOf("23423424666767"); 
     System.out.printf("%f\n", a); //23423424135168,000000 
     System.out.println(a);  //2.34234241E13 
    } 
} 

Un'altra cosa è: non si ottiene "2.3423424666767E13", è solo la rappresentazione visiva del numero in memoria. "Come stampi" e "ciò che è in memoria" sono due cose distinte. L'esempio sopra mostra come stampare il numero come float, che evita la notazione scientifica che stavi ottenendo.

1

La conversione da doppio a virgola mobile sarà una conversione di restringimento. Dal doc:

un restringimento di conversione primitivo può perdere informazioni sulla grandezza globale di un valore numerico e può anche perdere precisione e gamma.

Una conversione primitiva di restringimento da doppio a float è regolata da le regole di arrotondamento IEEE 754 (§4.2.4). Questa conversione può perdere la precisione di , ma anche perdere l'intervallo, risultando in uno zero mobile da un doppio diverso da e un infinito float da un doppio finito.Un doppio NaN viene convertito in un NaN float e un doppio infinito viene convertito nell'iffiodo float stesso con lo stesso numero di serie. .

Quindi non è una buona idea. Se si vuole ancora che si può fare come:

double d = 3.0; 
float f = (float) d; 
0

Prima di tutto, il fatto che il valore nel database è un galleggiante non significa che si inserisce anche in un Java float. Float è l'abbreviazione di virgola mobile e esistono tipi a virgola mobile di varie precisioni. I tipi Java float e double sono entrambi tipi a virgola mobile di diversa precisione. In un database entrambi sono chiamati FLOAT. Poiché double ha una precisione maggiore di float, probabilmente è un'idea migliore non per trasmettere il valore a float, perché si potrebbe perdere la precisione.

È inoltre possibile utilizzare BigDecimal, che rappresenta un numero di precisione arbitrario.

1

Float.parseFloat (String.valueOf (your_number)

+2

Non molto performante, vero? –

1

Converti Double a Float

public static Float convertToFloat(Double doubleValue) { 
    return doubleValue == null ? null : doubleValue.floatValue(); 
} 

Convertire double a Float

public static Float convertToFloat(double doubleValue) { 
    return (float) doubleValue; 
}