Je suis confronté à un problème lié à la conversion de double
en float
. En fait, je stocke un type flottant, 23423424666767
, dans une base de données, mais lorsque nous obtenons des données à partir de la base de données dans le code ci-dessous, getInfoValueNumeric()
, il est de type double
. La valeur que nous obtenons est sous la forme 2.3423424666767E13
.
Alors, comment pouvons-nous obtenir des données au format float
telles que 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);
}
Il suffit de jeter votre double sur un flotteur.
double d = getInfoValueNumeric();
float f = (float)d;
Notez également que les types primitifs ne peuvent PAS stocker un ensemble infini de nombres:
float range: from 1.40129846432481707e-45 to 3.40282346638528860e+38
double range: from 1.7e–308 to 1.7e+308
Je vous suggère de récupérer la valeur stockée dans la base de données en tant que type BigDecimal:
BigDecimal number = new BigDecimal("2.3423424666767E13");
int myInt = number.intValue();
double myDouble = number.doubleValue();
// your purpose
float myFloat = number.floatValue();
BigDecimal vous fournit de nombreuses fonctionnalités.
Convertir Double
en Float
public static Float convertToFloat(Double doubleValue) {
return doubleValue == null ? null : doubleValue.floatValue();
}
Convertir double
en Float
public static Float convertToFloat(double doubleValue) {
return (float) doubleValue;
}
Pour répondre à votre question sur "Comment convertir 2.342342466676767E13 en 23423424666767"
Vous pouvez utiliser un décimal formateur pour formater des nombres décimaux.
double d = 2.3423424666767E13;
DecimalFormat decimalFormat = new DecimalFormat("#");
System.out.println(decimalFormat.format(d));
Sortie: 23423424666767
La conversion de double en float réduira la conversion. Depuis le doc :
Une conversion primitive restrictive peut perdre des informations sur le magnitude globale d’une valeur numérique et peut également perdre de la précision et intervalle.
Une conversion primitive étroite de double en float est régie par les règles d'arrondi IEEE 754 (§4.2.4). Cette conversion peut perdre précision, mais aussi perdre de la plage, résultant en un float zéro à partir d'un double non nul et un infini flottant à partir d'un double fini. Un double NaN est converti en un NaN float et un double infini est converti en même signe float infinity.
Donc ce n'est pas une bonne idée. Si vous le voulez encore, vous pouvez le faire comme:
double d = 3.0;
float f = (float) d;
Tout d’abord, le fait que la valeur dans la base de données soit un float ne signifie pas qu’elle s’intègre également dans une Java float
. Float est l'abréviation de float, et il existe des types de virgule flottante de différentes précisions. Les types Java float
et double
sont tous deux des types à virgule flottante de précision différente. Dans une base de données, les deux sont appelés FLOAT
. Étant donné que double
a une précision plus élevée que float
, il est probablement préférable de pas de transtyper votre valeur en float
, car vous risqueriez de perdre de la précision.
Vous pouvez également utiliser BigDecimal
, qui représente un nombre de précision arbitraire.
Le problème est que votre valeur ne peut pas être stockée avec précision dans un type à virgule flottante simple précision. Preuve:
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
}
}
Une autre chose est: vous n'obtenez pas "2.342342466676767E13", c'est juste la représentation visuelle du nombre stocké en mémoire. "Comment imprimer" et "ce qui est en mémoire" sont deux choses distinctes. L'exemple ci-dessus vous montre comment imprimer le nombre en tant que nombre flottant, ce qui évite la notation scientifique que vous obteniez.
Utilisez la conversion de type de données. Par exemple:
// converting from double to float:
double someValue;
// cast someValue to float!
float newValue = (float)someValue;
À votre santé!
Remarque:
Les entiers sont des nombres entiers, par exemple 10, 400 ou -5.
Les nombres à virgule flottante (float) ont des décimales et des décimales, par exemple 12,5 et 56,7786543.
Les doubles sont un type spécifique de nombre à virgule flottante qui ont une précision supérieure à celle des nombres à virgule flottante standard (ce qui signifie qu'ils sont précis avec un nombre de décimales supérieur).