Question

J'utilise java et je fais référence au "double". Type de données. Pour rester bref, je lis certaines valeurs de l'entrée standard que je lis dans mon code en double (je préférerais beaucoup utiliser quelque chose comme BigInteger mais pour l'instant ce n'est pas possible).

J'espère obtenir des valeurs doubles de la part de l'utilisateur, mais il peut parfois entrer des informations telles que: 99999999999999999999999999999999999999 ce qui, je pense, dépasse la représentation exacte de double et se arrondit à 1.0E27 (probablement).

Je voudrais avoir quelques indications sur la manière de détecter si une valeur spécifique ne pourrait pas être représentée avec précision dans un double et nécessiterait d'être arrondie (pour que je puisse refuser cette valeur ou d'autres actions de ce type).

Merci beaucoup

Était-ce utile?

La solution

La plupart des valeurs entrées par les humains ne seront pas exactement représentables par 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'ampleur 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 si " erreur " est assez petit.

Autres conseils

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

Vous ne pouvez pas utiliser un double pour stocker quelque chose de manière précise, très rarement un utilisateur peut entrer un nombre qu'un double peut parfaitement représenter, mais ce serait une coïncidence. Si vous avez besoin de stocker le nombre exact, vous pouvez utiliser une chaîne tant que vous n’avez aucune manipulation à effectuer. Si vous avez besoin de plus que cela, il y a probablement des bibliothèques qui sont faites pour ce genre de maths précis.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top