2010-08-15 14 views
1

Quelle est la meilleure façon de déterminer si un flottant donné (ou un double) n'a pas de décimales significatives?Arrondi de virgule flottante (en java)

 
f(234.0) = true 
f(34.45) = false 
f(3.1322) = false 

-à-dire l'équivalent de

EQ(((int)number) * 1.0 , number)

où EQ est une méthode donnée à comparer les points flottants et il est correct de penser que le flotteur correspond à un nombre entier. Arrondissez la valeur à l'entier le plus proche et calculez la différence absolue par rapport à la valeur réelle.

+0

Votre prénom est Josh par hasard? – Tom

Répondre

1

Si cette différence est inférieure à un certain pourcentage de la valeur réelle, vous êtes fermé "assez".

+0

Salut Thor, j'espérais une solution qui évite le casting. Peut-on faire de la jonglerie avec Float.floatToRawIntBits() etc. qui est plus efficace que ça? – baskin

+0

Pourquoi? Avez-vous déjà profilé? –

+0

'MicroBenchmarking' est difficile, n'est ce pas? Et je pensais que les profileurs réguliers seraient inutiles ici (?) – baskin

0

Vous pouvez essayer quelque chose comme ceci:

public static boolean f(double d) { 
    return d % 1 == 0; 
} 
2

Math.rint(x) == x

Math.rint() retourne un double, il travaille aussi pour un grand nombre où le résultat long de Math.round() déversoirs.

Notez que ceci donne aussi vrai pour l'infini positif et négatif. Vous pouvez les exclure explicitement par Math.rint(x) == x && !Double.isInfinite(x).

+0

+1 pour utiliser 'rint' plutôt que toute autre méthode d'arrondi à entier. Puisque cela arrondit à l'entier * le plus proche *, il ne nécessite généralement pas de changement de mode d'arrondi du FPU (qui peut être étonnamment lent). [Bien que je crois que c'est moins un problème ces jours-ci, grâce aux instructions SSE dans les nouveaux processeurs x86/x64.] –