2016-12-31 2 views
0

Je réécris un ancien programme Java 6 écrit pour effectuer des calculs scientifiques en Java 8 et je suis bloqué dans cette situation où j'obtiens des résultats différents pour l'opération d'arrondi.Différents résultats d'arrondi en Java 6 et Java 8

Java 6 arrondit une entrée comme 0.499999999999999999994 à 1 mais Java 8 le rend 0. Je ne suis pas capable de comprendre le problème ici.

Par exemple:

private void foo() { 
    System.out.println(Math.round(0.499999999999999999994)); 
} 

Le code ci-dessus se comporte différemment pour les différentes versions de Java.

Ce serait génial si quelqu'un pouvait faire la lumière sur ce problème.

+0

poster votre java 6 et java 8 code – Aaron

+0

@Aaron J'ai inclus le code de base. Merci pour votre commentaire. –

Répondre

2

Je pense que vous êtes tombé sur un bogue connu dans Java 6 qui a ensuite été corrigé dans Java 7. Cela explique le comportement de code bizarre dans Java 6 et Java 8.

Infos Bug:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6430675

Plus d'informations et belle explication par @OliverCharlesworth se trouvent dans ce post:

Why does Math.round(0.49999999999999994) return 1

Extrait de son poste:

En Java 6 (et vraisemblablement plus tôt), round (x) est implémenté comme floor (x + 0.5). Ceci est un bug de spécification, pour précisément celui-ci cas pathologique. Java 7 n'impose plus cette implémentation cassée.

+0

Merci. Y a-t-il un correctif pour cela? –

+0

Fermeture en tant que question en double peut-être plus approprié alors – weston

+2

Que voulez-vous dire fixer @ShivamNegi? Il est maintenant corrigé, alors voulez-vous dire le casser de nouveau dans java 8, ou appliquer le correctif en arrière à java 6? – weston

1

La raison pour laquelle la sortie de votre exemple est 0 est différente. 0.999999999999999999994 est un double. Coulée d'un double à un il laisse tomber les décimales de la valeur double.

public class Example { 
    public static void main(String[] args) { 
     double d1 = 0.9; 
     Double D1 = Double.valueOf(d1); 
     int d1AsInt = (int)d1; 
     System.out.println("d1 as int:\t" + d1AsInt); 
     System.out.println("d1 as int:\t" + D1.intValue()); 
    } 
} 

Si vous comptez sur des valeurs précises, vous devez utiliser BigDecimal et BigInteger.

+0

Je suis désolé d'avoir dérouté le code. Je vois ce comportement avec 'Math.round()' –