2008-11-06 4 views
2

J'utilise java et je me réfère au type de données "double". Pour être bref, je lis des valeurs de l'entrée standard que j'ai lues dans mon code en double (je préfèrerais utiliser quelque chose comme BigInteger mais pour le moment ce n'est pas possible).Détection d'arrondi à virgule flottante

Je me attends à obtenir le double des valeurs de l'utilisateur, mais parfois, ils pourraient les choses d'entrée comme: 999999999999999999999999999,9999999999 que je pense est au-delà d'une représentation précise pour le double et obtenir son arrondi à 1.0E27 (probablement). Je voudrais obtenir des pointeurs sur la façon de détecter si une valeur spécifique ne pourrait pas être représentée avec précision dans un double et nécessiterait un arrondi (afin que je puisse refuser cette valeur ou d'autres actions similaires).

Merci beaucoup

Répondre

4

La plupart des valeurs saisies par les humains ne seront pas exactement représentable avec un double.

Par exemple, voulez-vous empêcher l'utilisateur d'entrer 0,1? Ce n'est pas exactement représentable en tant que double.

Pour trouver l'échelle de l'erreur, vous pouvez faire quelque chose comme:

BigDecimal userAsDecimal = new BigDecimal(userInput); 
double userAsDouble = double.parseDouble(userInput); 
BigDecimal doubleToDecimal = new BigDecimal(userAsDouble); 
BigDecimal error = userAsDecimal.subtract(userAsDouble).abs(); 

Vérifiez ensuite que « erreur » est assez petite.

+0

En effet, vous avez raison. Pour être plus précis, j'obtiendrai toujours des nombres positifs avec au plus 10 chiffres de précision, donc mon exigence serait de limiter toute la partie du nombre pour qu'elle ne cause pas l'arrondi – cupu

+0

J'ai peur de ne pas encore '' Je comprends très bien. Voulez-vous dire que vous obtiendrez seulement des nombres entiers? Si c'est le cas, utilisez un long. Sinon, je me perds à nouveau ... –

+0

J'ai eu un peu de mal à formuler la requête Merci (surtout) et tous ceux qui ont répondu, le double est vraiment mauvais à utiliser dans mon cas ... Je me suis plaint un peu pendant un moment :). – cupu

2
double orig = GetSomeDouble(); 
double test1 = orig - 1; 
if (orig == test1) 
    SomethingIsWrong(); 
double test2 = test1 + 1; 
if (orig != test2) 
    SomethingIsWrong(); 
+0

Merci pour l'extrait .. c'est un test pratique et une bonne expérience d'apprentissage pour moi pour ainsi dire. Je ne vais pas l'utiliser probablement parce que je vais éliminer les valeurs infinies .. mais c'est mon problème :). Merci encore – cupu

1

Vous ne pouvez pas utiliser un double pour stocker quelque chose précisément la façon dont vous vous demandez, très rarement un utilisateur peut saisir un numéro double peut parfaitement représenter, mais ce serait un hasard seulement. Si vous avez besoin de stocker le nombre exact, vous pouvez utiliser une chaîne tant que vous n'avez pas besoin de faire de manipulation. Si vous avez besoin de plus que cela, il y a probablement des bibliothèques qui sont faites pour ce type de calcul précis.

+0

Correct, merci – cupu

Questions connexes