2010-01-21 2 views
5

J'ai quelques entrées sur mon site représentant des nombres à virgule flottante avec jusqu'à dix chiffres de précision (en décimal). À un certain moment, dans le code de validation côté client, j'ai besoin de comparer deux de ces valeurs pour voir si elles sont égales ou non, et ici, comme on peut s'y attendre, les intrinsèques de IEEE754 échouent avec des choses comme (2.0000000000 == 2.0000000001) = true.Précision arbitraire Chiffres flottants sur JavaScript

Je peux casser le nombre à virgule flottante en deux longs pour chaque côté du point, faire à chaque côté une longueur de 64 bits et faire mes comparaisons manuellement, mais il semble si moche!

Une bibliothèque JavaScript correcte pour gérer les nombres flottants de précision arbitraires (ou au moins garantis) sur Javascript?

Merci d'avance!

PS: Une solution basée GWT a ++

+0

Ce problème peut apparaître sur tout point flottant de précision arbitraire, sinon vous définissez la précision pour l'égalité. C'est la nature intrinsèque des nombres à virgule flottante. Utilisez un calcul à virgule fixe avec une longueur arbitraire. – kirilloid

+0

@kirilloid bien sûr il peut apparaître, juste pensé qu'il valait la peine d'élaborer la question (conduit généralement à des réponses plus élaborées). Merci quand même! – opsidao

Répondre

1

Il y a la bibliothèque GWT-MATH à http://code.google.com/p/gwt-math/.

Cependant, je vous préviens, c'est une superposition GWT jsni d'une conversion automatique java-> javascript de java.BigDecimal (en fait l'ancien com.ibm.math.BigDecimal).

Cela fonctionne, mais ce n'est pas le cas. (Ni maigre, il va bien sur 70k dans votre projet).

Sur mon lieu de travail, nous travaillons sur un point décimal simple à point fixe, mais rien qui vaille la peine d'être publié. :(

+1

semble prometteur! Merci! (Je ne pense pas que la performance sera un problème, est juste pour la validation, le vrai calcul est fait sur le serveur en utilisant R;)) – opsidao

1

Utilisez une bibliothèque entière de précision arbitraire tels que silentmatt’s javascript-biginteger, qui permet de stocker et de calculer avec des nombres entiers de toute taille arbitraire.

Puisque vous voulez dix décimales, vous devez stocker la valeur n comme n×10^10 Par exemple, mémoriser 1 comme 10000000000 (dix zéros), 1.5 comme 15000000000 (neuf zéros), etc. Pour afficher la valeur pour l'utilisateur, placez simplement un point décimal devant le dixième et dernier caractère zéros de fin si vous voulez)

Alternativement vous pourrait stocker un numérateur et un dénominateur comme bigintegers, ce qui vous permettrait alors arbitrairement des valeurs fractionnaires précises (mais attention - les valeurs fractionnaires ont tendance à devenir très grandes très rapidement).