Konvertieren Sie double in float in Java


76

Ich stehe vor einem Problem im Zusammenhang mit der Konvertierung doublein float. Eigentlich speichere ich einen Float-Typ 23423424666767in einer Datenbank, aber wenn wir Daten aus der Datenbank im folgenden Code erhalten, getInfoValueNumeric()ist er vom doubleTyp. Der Wert, den wir erhalten, ist in der 2.3423424666767E13Form.

Wie erhalten wir also Formatdaten floatwie 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);
}

3
Wirf es einfach. doppeltes d = 3,0; float f = (float) d;
Tom Wellbrock

Die Zahlen sehen gleich aus, nur unterschiedliche Darstellungen mit demselben Wert.
mksteve

Es funktioniert nicht für mich
Sitansu

Wenn es sich um die Formatierung handelt, die Sie erreichen möchten, verwenden Sie die NumberFormat-Bibliothek. Wenn Sie Ihre Nummer verkürzen möchten. Wie: 10000-> 100 könnten Sie math.round ()
Tom Wellbrock

floathat nicht genug Genauigkeit für solche Zahlen wie 23423424666767. Es kann nur auf ~ 7 Dezimalstellen genau sein
phuclv

Antworten:


188

Wirf einfach dein Double auf einen Schwimmer.

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

Beachten Sie auch, dass die primitiven Typen NICHT unendlich viele Zahlen speichern können:

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

4
@JimmyKane stellen Sie sicher, dass Sie die primitiven Typen "float" und "double" verwenden und nicht die Objekttypen "Float", "Double".
Tom Wellbrock

1
Hey, Tom, das ist eine teure Operation. Können Sie erklären, was Java unter der Haube tut?
Sam Orozco

@SamOrozco Hier sind im Grunde zwei Dinge, die passieren: 1. Der doppelte Wert wird automatisch an seinen Objekttyp angehängt. Es ist im Grunde eine neue Instanz von Double, die den primitiven Doppelwert enthält. 2. Da die objectTypes Double und Float beide von Number abgeleitet sind, können sie ineinander konvertiert werden.
Tom Wellbrock

Kommen wir nun zu Ihrer Frage zurück, da wir unseren Typ von Double auf Float eingrenzen, anstatt ihn zu erweitern, z. Double to Object. Java muss zur Laufzeit nach möglichen ClassCastExceptions suchen. Aber ich kann nicht wirklich sagen, wie viel Overhead das produziert. Die Berechnung selbst ist nichts anderes als das Erstellen von Objektinstanzen (Autoboxing) und das Abrufen des primitiven Werts (AutoUnboxing). Ich weiß, dass meine Antwort vage ist, aber ich hoffe, dass sie trotzdem hilft. Wenn Sie wirklich interessiert sind, lesen Sie die Themen zum automatischen (Un-) Boxen hier bei Stackoverflow.
Tom Wellbrock

26

Ich empfehle Ihnen, den in der Datenbank gespeicherten Wert als BigDecimal-Typ abzurufen:

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

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

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

BigDecimal bietet Ihnen viele Funktionen.


4
Wenn jemand einen Wert übergibt, der kein String ist, wird empfohlen, BigDecimal.valueOf () anstelle von new BigDecimal () zu verwenden . Siehe https://dev.eclipse.org/sonar/rules/show/squid:S2111
River

Diese alte Verbindung ist tot. Hier ist eine andere: sonar.spring.io/coding_rules#rule_key=squid%3AS2111
River

16

Konvertieren DoubleinFloat

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

Konvertieren doubleinFloat

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

8

Dies ist ein guter Weg, um es zu tun:

Double d = 0.5;
float f = d.floatValue();

Wenn Sie d als primitiven Typ haben, fügen Sie einfach eine Zeile hinzu:

double d = 0.5;
Double D = Double.valueOf(d);
float f = D.floatValue();

3

So beantworten Sie Ihre Frage zu "So konvertieren Sie 2.3423424666767E13 in 23423424666767"

Sie können einen Dezimalformatierer zum Formatieren von Dezimalzahlen verwenden.

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

Ausgabe: 23423424666767


3
Dies konvertiert keinen doppelten Wert in eine float ... format-Methode, die ein String-Objekt zurückgibt.
Antoniodvr

gut danach kann der String ohne großen Aufwand analysiert werden
Tom Wellbrock

2
Sie können einen Zeichenfolgenwert jederzeit mit 'Float.parseFloat (decimalFormat.format (d))' in float konvertieren. Obwohl es immer noch den Wert mit wissenschaftlicher Darstellung als 2.34234241E13 darstellt .
Priyambada Madala

3

Die Umstellung von Double auf Float ist eine engere Umstellung. Aus dem Dokument :

Eine sich verengende primitive Konvertierung kann Informationen über die Gesamtgröße eines numerischen Werts verlieren und kann auch an Präzision und Reichweite verlieren.

Eine sich verengende primitive Umwandlung von Double zu Float wird durch die IEEE 754-Rundungsregeln (§4.2.4) geregelt. Diese Konvertierung kann an Präzision verlieren, aber auch an Reichweite, was zu einem Float-Nullpunkt von einem Double ungleich Null und einem Float-Unendlichkeit von einem endlichen Double führt. Ein doppeltes NaN wird in ein Float-NaN umgewandelt, und eine doppelte Unendlichkeit wird in die gleich signierte Float-Unendlichkeit umgewandelt.

Es ist also keine gute Idee. Wenn Sie es immer noch wollen, können Sie es wie folgt tun:

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

0

Das Problem ist, dass Ihr Wert im Gleitkommatyp mit einfacher Genauigkeit nicht genau gespeichert werden kann. Beweis:

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
    }
}

Eine andere Sache ist: Sie erhalten nicht "2.3423424666767E13", sondern nur die visuelle Darstellung der im Speicher gespeicherten Nummer. "Wie Sie ausdrucken" und "Was ist im Speicher" sind zwei verschiedene Dinge. Das obige Beispiel zeigt Ihnen, wie Sie die Zahl als Gleitkomma drucken, wodurch die wissenschaftliche Notation vermieden wird, die Sie erhalten haben.


0

Erstens bedeutet die Tatsache, dass der Wert in der Datenbank ein Float ist, nicht, dass er auch in ein Java passt float. Float ist die Abkürzung für Gleitkomma , und es gibt Gleitkommatypen mit verschiedenen Genauigkeiten. Java-Typen floatund doublesind beide Gleitkommatypen mit unterschiedlicher Genauigkeit. In einer Datenbank werden beide aufgerufen FLOAT. Da doubleeine höhere Präzision als hat float, ist es wahrscheinlich eine bessere Idee nicht Ihren Wert für einen zu werfen float, weil Sie Präzision verlieren.

Sie können auch verwenden BigDecimal, die eine Zahl mit beliebiger Genauigkeit darstellen.


0

Verwenden Sie dataType Casting. Zum Beispiel:

// converting from double to float:
double someValue;
// cast someValue to float!
float newValue = (float)someValue;

Prost!

Hinweis:

Ganzzahlen sind ganze Zahlen, z. B. 10, 400 oder -5.

Gleitkommazahlen (Gleitkommazahlen) haben Dezimalstellen und Dezimalstellen, z. B. 12,5 und 56,7786543.

Doubles sind eine bestimmte Art von Gleitkommazahlen, die genauer sind als Standard-Gleitkommazahlen (was bedeutet, dass sie auf eine größere Anzahl von Dezimalstellen genau sind).


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.