7
votes

Imprimer Java Double à System.out en Java

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 commentaires

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


6 Réponses :


2
votes

Lorsque vous avez besoin de précision: utilisez bigdecimal au lieu de double .

Reportez-vous à cette question pour plus de détails: Double vs. BigDecimal?

Edit: Si vous n'avez pas besoin de précision; Vous êtes d'accord avec la mise en forme de la sortie ..


2 commentaires

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.



2
votes

Essayez de formater votre sortie: xxx

Pour plus d'informations sur la sortie de formatage, reportez-vous au docs


0 commentaires

0
votes

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();
}


0 commentaires

0
votes

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.


0 commentaires

4
votes

Qu'est-ce que vous avez ici est inaccicipé de points flottants . Parce que double 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 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.

Vous pouvez corriger votre sortie en le formatant (par exemple, system.out.format ("% d. x =%. 1f", i, a); ) ou vous pouvez corriger vos numéros par en utilisant bigdecimal au lieu de double . Sinon, vous pouvez réduire l'échelle du problème en calculant A à chaque fois plutôt que d'accumuler (et d'ajouter une erreur incrémentielle à chaque fois), par ex. a = i / 10.0 . Cela dépend de ce que vous essayez d'atteindre.

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.


1 commentaires

Une très bonne explication qui donne à la fois la raison et les solutions pour deux scénarios différents!



1
votes

Un favori personnel de la mine est d'utiliser system.out.printf ()
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);

devrait faire le tour.

ressources: Feuille de triche Printf


1 commentaires

Pour l'enregistrement, system.out.printf et system.out.format sont exactement les mêmes.