Convertir de double à long Ronde sans Java

Je suis en train de convertir un double aléatoire pour un long temps sans arrondi ou en tronquant.
J'ai d'abord changer le double d'une chaîne de caractères, à savoir combien de décimales, il y a puis-je changer la valeur à long terme.
Mon problème est que le numéro de la dernière décimale n'est pas toujours exact, et je ne sais pas la raison et comment je peux le changer.
Voici le code:

            double z=(double) myRandom(1, 20);
    long test;
    String s = Double.toString(z);
    test=(long) (Math.pow(10, s.length()-s.indexOf(".")-1)*z);
    System.out.println("z: "+z);    
    System.out.println("double converted to long: "+test);

Et c'est la sortie:

d: 19.625014811604743

double converti à long: 19625014811604744

d: 9.143326452202839

double converti à long: 9143326452202838

d: 5.8964228376511105

double converti à long: 58964228376511104

d: 15.045936360299917

double converti à long: 15045936360299918

d: 14.147950026532694

double converti à long: 14147950026532694

  • J'ai oublié de vous poser une question
  • Double.toString(double) n'est pas nécessairement de sortie ce que vous pourriez vous attendre à partir de seulement aveuglément l'impression de chaque chiffre de la même double. Il fait un peu de magie pour essayer de se débarrasser de funky de répéter les chiffres des représentations binaires.
  • À virgule flottante, des erreurs d'arrondi. Pourquoi ne pas simplement prendre la chaîne que vous avez, remplacer "." avec "", et ensuite d'analyser dans un long? Ou, vous pouvez aller de double -> BigDecimal -> (plusieurs BigDecimal par le facteur approprié de 10) -> BigInteger. Qui fonctionne également si vos changements de code pour permettre d'effectuer des doubles.
  • Honnêtement semble que l'OP est juste essayer de mettre en œuvre BigDecimal.
  • Pourquoi vous préoccupez-vous de l'exactitude de 16 chiffres d'un nombre aléatoire?
  • à partir d'un "c'est juste" au travail en perspective, mais je recommande l'OP pour voir quelque chose de bizarre et je me demandais pourquoi il serait comme ça.
  • Il serait comme ça parce que vous avez seulement 16 chiffres de précision et lorsque vous effectuez un calcul le dernier chiffre peut être légèrement trop haute ou trop basse. Cela est dû au fait que le double ne peut pas représenter toutes les valeurs de l'OP cite.
  • Yup, j'ai posté une réponse avec qui il y a quelques minutes. J'étais juste de souligner que c'est bien de l'OP, pour ne pas simplement hausser les épaules et de dire "eh, assez bon", mais en fait se demander pourquoi il se produit.

InformationsquelleAutor user2661808 | 2013-08-07