Convertir float double
Je suis en train de convertir Single
à Double
tout en maintenant la valeur d'origine. J'ai trouvé la méthode suivante:
Single f = 5.2F;
Double d1 = f; //5.19999980926514
Double d2 = Double.Parse(f.ToString()); //5.2 (correct)
Cette pratique est recommandable? Je n'ai pas besoin d'une méthode optimale, mais la valeur doit être transmis à la double. Sont là, même les conséquences pour le stockage d'une valeur arrondie dans un double?
- Pas tous les nombres à virgule flottante représentant exactement, c'est pourquoi 5.2 devient 5.19999980926514.
- À partir d'un point de vue binaire, il est. 5.2 ne peut pas être représenté exactement comme un binaire à virgule flottante nombre, il vous donne la valeur la plus proche possible.
- Je comprends, mais ce n'est pas une chaîne de conversion d'un geste audacieux? Est-il inévitable?
- Que faites-vous de ces chiffres? Oui, la conversion d'un seul à une chaîne de caractères et l'analyse d'un double n'est probablement pas la meilleure approche.
- Je ne suis pas les utiliser pour des opérations, je suis à leur stockage. Le conteneur objets ne supporte pas l'
System.Single
donc, je dois les convertir. - Êtes-vous sûr que le
ToString()
n'est pas n'importe quel arrondissement? - est la 5.2 codé en dur ou le résultat d'un calcul? Si ce dernier peut vous faire le calcul avec des doubles pour obtenir une plus grande précision?
- De préférence, codée en dur, mais je ne peut pas prendre en charge. Virgule flottante est la logique de mon absolu vice; ce que j'ai vraiment besoin de savoir est; comment faire pour convertir
Single
àDouble
tout en maintenant la représentabilité dans le cas où la valeur est en fait codé en dur, ainsi que les valeurs sont sérialisés à un certain point. Je crois comprendre que directSingle
àDouble
la conversion n'est pas dangereux, mais c'est une question de présentation. - Alors, comment pensez-vous de préférence souhaitez afficher les autres à long décimales? Si Pi ont été envoyés sur par exemple? Peut-être qu'à stocker une Chaîne de caractères.Le Format et le point fixe de la valeur peut-être? #.## donc, vous auriez 3.14 pour Pi et 5.2...
- Les valeurs ne sont pas la mienne, je ne peux pas justifier un ajustement supplémentaire au-delà de aller-retour pour assurer le succès de la désérialisation.
- Bon, alors je collerais avec xanatos mentionner qu'ils sont vraiment le même numéro, juste avec différents précision représentés.
Vous devez vous connecter pour publier un commentaire.
La conversion est exacte. Tous les
Single
valeurs peuvent être représentées par unDouble
valeur, parce qu'ils sont "intégrés" dans le même sens, juste avec plus de chiffres possibles. Ce que vous voyez comme 5.2 F est dans la vérité5.1999998092651368
. Si vous allez http://www.h-schmidt.net/FloatConverter/IEEE754.html et insérez 5.2 vous verrez qu'il a un exposant de 2^2 (donc 4) et une mantisse de 1.2999999523162842. Maintenant, si vous multipliez les deux numéros que vous aurez 5.1999998092651368.Single
avoir un maximum de précision de 7 chiffres, donc .NET ne montre que 7 chiffres. Avec un peu d'arrondi 5.1999998092651368 est 5.2Vous pourriez utiliser "virgule" au lieu d'une chaîne.
Si vous savez que vos numéros sont multiples de par exemple de 0,01, je vous conseille de vous convertir à double, arrondir à l'entier le plus proche, et soustrayez-le pour obtenir la fraction de résidus. Multiplier par 100, arrondir à l'entier le plus proche, et ensuite de diviser par 100. Ajouter que l'ensemble-numéro de la partie pour obtenir le plus proche
double
à la représentation multiple de 0,01, ce qui est le plus proche de l'original.Notez que selon où l'
float
valeurs originaire, un tel traitement peut ou ne peut pas améliorer la précision. Le plus prochefloat
de la valeur à 9000.02 est d'environ 9000.019531, et le plus prochefloat
de la valeur à 9000.021 est d'environ 9000.021484 f. Si les valeurs ont été obtenues par la conversion de 9000.020 et 9000.021 àfloat
, la différence entre eux doit être d'environ 0,01. Si, toutefois, ils étaient arrivés à par exemple de calcul9000f+0.019531f
et9000f+0.021484f
, la différence entre eux doit être le plus proche de 0.02. Le résultat est arrondi au plus proche de 0,01 avant de le soustraire permettrait d'améliorer la précision dans le premier cas et à se dégrader dans le second.