Ce code ne fonctionne pas car je pensais que ce serait.
0. x= -1.0 1. x= -0.9 2. x= -0.8 3. x= -0.7000000000000001 4. x= -0.6000000000000001 5. x= -0.5000000000000001 6. x= -0.40000000000000013 7. x= -0.30000000000000016 8. x= -0.20000000000000015 9. x= -0.10000000000000014 10. x= -1.3877787807814457E-16 11. x= 0.09999999999999987 12. x= 0.19999999999999987 13. x= 0.2999999999999999 14. x= 0.3999999999999999 15. x= 0.4999999999999999 16. x= 0.5999999999999999 17. x= 0.6999999999999998 18. x= 0.7999999999999998 19. x= 0.8999999999999998 20. x= 0.9999999999999998
6 Réponses :
Lorsque vous avez besoin de précision: utilisez Reportez-vous à cette question pour plus de détails: Double vs. BigDecimal? P>
Edit: Si vous n'avez pas besoin de précision; Vous êtes d'accord avec la mise en forme de la sortie .. p> bigdecimal code> au lieu de
double code>. p>
Non, il a juste besoin de formater sa production. Celles-ci ne sont pas des équations d'ingénierie financière ou de fusée, mais de simples calculs de points flottants. L'utilisation d'un double avec sortie formatée fera bien.
@ Hoverftfulleels: comment savons-nous? Notre astucieux ne nous dit pas quelle est l'application en aval de ceci.
Essayez de formater votre sortie: Pour plus d'informations sur la sortie de formatage, reportez-vous au docs p> p>
Vous utilisez probablement des Ints pour chacun de ces objets. Au lieu de cela, lorsque vous allez les afficher, appelez cette méthode d'abord:
public static double round(double value, int places) { if (places < 0) throw new IllegalArgumentException(); BigDecimal bd = new BigDecimal(value); bd = bd.setScale(places, BigDecimal.ROUND_HALF_UP); return bd.doubleValue(); }
Utilisez String.Format ou une syntaxe de formatage décimale de la douleur à System.out.println et vous devriez voir ce que vous voulez. Le point de flotteur arithmétique est représenté intérieurement de manière différente. Donc, une simple impression de telles valeurs ne vous donnera toujours que vous souhaitez que vous ayez besoin d'intermédiaires du format de vue de l'écran. P>
Qu'est-ce que vous avez ici est Vous pouvez corriger votre sortie en le formatant (par exemple, Le "message à la maison important" est que les doubles ne peuvent pas être invoqués pour donner des réponses précises complètes et vous devez vous attendre à de petites erreurs en arithmétique à virgule flottante. P> double code> s ont une précision limitée, elles ne peuvent pas représenter avec précision tous les nombres décimaux. En particulier,
0,1 code> est un binaire récurrent SO Toutes les représentations binaires finies de la longueur finie seront inexactes. Cela signifie que l'ordinateur ne peut pas stocker les chiffres que vous utilisez exactement. P>
system.out.format ("% d. x =%. 1f", i, a); code>) ou vous pouvez corriger vos numéros par en utilisant
bigdecimal code> au lieu de
double code>. Sinon, vous pouvez réduire l'échelle du problème en calculant
A code> à chaque fois plutôt que d'accumuler (et d'ajouter une erreur incrémentielle à chaque fois), par ex.
a = i / 10.0 code>. Cela dépend de ce que vous essayez d'atteindre. P>
Une très bonne explication qui donne à la fois la raison et les solutions pour deux scénarios différents!
Un favori personnel de la mine est d'utiliser devrait faire le tour. P>
ressources:
Feuille de triche Printf P> system.out.printf () code>
Comme si c'était C contrepartie, vous définissez le type des variables que vous allez passer à cela, puis il suffit de le jeter une chose de ce type. Par example
system.out.printf ("%. 1f", yourdouble); code> p>
Pour l'enregistrement, system.out.printf code> et
system.out.format code> sont exactement les mêmes.
Vous n'avez pas spécifié le type de A et B dans votre échantillon de code. Pouvez-vous ajouter ça?
Tu ne fais rien de mal. C'est juste que les décimales ne peuvent pas être parfaitement représentées par binaire. Il existe donc un peu de différence entre la valeur attendue et la valeur réelle stockée.
C'est un duplicata de nombreuses questions. Trouvons un bon candidat en double et fermons ceci.
Vous pourriez trouver flottant-point-gui.de utile.
Vous avez posé une question et avez fourni tous les détails. Peu de gens font cela lors de leurs premières questions, même s'il s'agit d'un duplicata. +1
J'ai également donné une appréciation de +1 à la suite de @sotiriosdelimanolis, puis a immédiatement fermé votre question: p