2017-06-21 5 views
0

J'ai récemment couru dans la curiosité suivante:Précision lors de la conversion de Double à Float lors de la concaténation de chaînes?

double d=0.8608278036117554; 
    String precision="float"; 

    float f=(float)d; 
    String s="a " + (precision.equals("float") ? (float)d: d) + " Bonjour"; 
    String s2="a " + String.valueOf(precision.equals("float") ? (float)d: d) + " Bonjour"; 
    String s3="a " + (precision.equals("float") ? String.valueOf((float)d): String.valueOf(d)) + " Bonjour"; 


    println(d); 
    println(f); 
    println(s); 
    println(s2); 
    println(s3); 


//0.8608278036117554 
//0.8608278 
//a 0.8608278036117554 Bonjour 
//a 0.8608278036117554 Bonjour 
//a 0.8608278 Bonjour 

Pourquoi est-il pas possible d'avoir un flotteur agréable lors du calcul s ou s2? Pourquoi est-ce encore un double dans le cas s et s2? PS: Cette question n'a rien à voir avec la mise en forme des nombres, selon moi. Je veux vraiment comprendre pourquoi le (flotteur) d cast ne fonctionne pas !!

+1

Le résultat d'un 'booléen? float: double' est un 'double' Il est lancé pour flotter mais il est en train d'être renvoyé en double. –

Répondre

3

Votre expression precision.equals("float") ? (float)d: d n'a pas d'effet, que l'opérateur conditionnel a un seul type de CONSÉQUENT, qui est double si un argument a le type float et l'autre a le type double.

Ainsi, la première alternative sera élargie de float à double et tandis que la conversion de double à float et retour à double peut avoir un effet sur la valeur, String.valueOf(double) sera appelée dans les deux cas.

Vous pouvez utiliser (precision.equals("float") ? String.valueOf((float)d): String.valueOf(d)) à la place, dont les invocations de méthode ne sont pas redondantes, car il s'agit d'invocations de méthodes différentes, String.valueOf(float) et String.valueOf(double). Cela dit, vous ne devriez pas utiliser le rétrécissement float pour contrôler la sortie. Cochez Format Float to n decimal places pour les alternatives qui offrent plus de contrôle sur la sortie formatée.

+0

Je comprends mieux maintenant. Mais alors, s'il est jeté à un flotteur et retour à doubler, comment se fait-il que la précision ne soit pas perdue? Ne devrais-je pas avoir un tas de zéros à la fin au lieu des vraies doubles décimales? – Myoch

+1

La précision de 'float' et' double' est définie en termes de chiffres * binaires * et non de chiffres décimaux. Pour certaines valeurs, cette conversion peut tronquer certains bits non nuls (c'est pourquoi j'ai dit que * peut avoir un effet sur la valeur), mais la valeur résultante n'est pas nécessairement une valeur avec moins de chiffres décimaux. – Holger

+0

En effet, j'ai essayé le casting d'avant en arrière, séparément de toute la substance "String", je reçois le même double du flotteur. Donc, si je comprends bien, c'est vraiment une coïncidence qui a conduit au même double, et si j'avais choisi un autre exemple, j'aurais pu repérer un changement dans les chiffres, n'est-ce pas? – Myoch