2010-01-21 6 views
5

Mam kilka danych wejściowych w mojej witrynie reprezentujących liczby zmiennoprzecinkowe z maksymalnie dziesiętnymi cyframi dokładności (w systemie dziesiętnym). W pewnym momencie, w kodzie walidacyjnym po stronie klienta, muszę porównać kilka z tych wartości, aby zobaczyć, czy są one równe, czy nie, a tutaj, jak można się spodziewać, nieinwazyjność IEEE754 sprawia, że ​​proste sprawdzenie kończy się niepowodzeniem z takimi rzeczami jak (2.0000000000 == 2.0000000001) = true.Arbitralna precyzja Liczba zmiennoprzecinkowa na JavaScript

Mogę złamać liczbę zmiennoprzecinkową w dwóch długich dla każdej strony kropki, zrobić każdej stronie 64-bitową długość i zrobić moje porównania ręcznie, ale wygląda tak brzydko!

Przyzwoita biblioteka JavaScript do obsługi dowolnych (lub przynajmniej gwarantowanych) liczb zmiennoprzecinkowych na JavaScript?

Z góry dziękuję!

PS: GWT rozwiązanie oparte A ma ++

+0

Ten problem może pojawić się NA dowolnym dowolnym zmiennoprzecinkowym precyzji, w przeciwnym razie należy ustawić dokładność dla równości. Jest to nieodłączny charakter liczb zmiennoprzecinkowych. Używaj matematyki ustalonej z dowolną długością. – kirilloid

+0

@kirilloid oczywiście może się wydawać, po prostu pomyślałem, że warto było rozwinąć pytanie (zwykle prowadzi to do bardziej dopracowanych odpowiedzi). Dzięki i tak! – opsidao

Odpowiedz

1

Istnieje biblioteki GWT-Math w http://code.google.com/p/gwt-math/.

Ostrzegam jednak, że jest to nakładka jsni GWT w java-> javascript automatycznej konwersji java.BigDecimal (w rzeczywistości stary com.ibm.math.BigDecimal).

Działa, ale szybko nie jest. (Nie szczupła, to będzie wkładać dobre 70k do twojego projektu).

W moim miejscu pracy pracujemy nad stałym punktem dziesiętnym, ale nic, co warto jeszcze opublikować. :(

+1

wygląda obiecująco! dzięki! (Nie sądzę, że wydajność będzie problemem, służy tylko do sprawdzania poprawności, prawdziwa matematyka jest wykonywana na serwerze za pomocą R;)) – opsidao

1

Użyj dowolnej precyzji całkowitą biblioteki takie jak silentmatt’s javascript-biginteger, które można zapisać i obliczyć z liczb całkowitych o dowolnej wielkości.

Ponieważ chcesz dziesięć miejsc po przecinku, musisz zapisać wartość n jak n×10^10 Na przykład zapisz 1 jako 10000000000 (dziesięć zer), 1.5 jako 15000000000 (dziewięć zer), itp. Aby wyświetlić wartość dla użytkownika, po prostu umieść przecinek dziesiętny przed dziesiątym ostatnim znakiem (a następnie odetnij zera zer, jeśli chcesz).

Alternatywnie możesz może przechowywać licznik i mianownik jako bigintegery, co umożliwiłoby ci arbitralnie precyzyjne wartości ułamkowe (ale uwaga - wartości ułamkowe zwykle bardzo szybko stają się bardzo duże).