2010-01-21 19 views
5

Ich habe auf meiner Site einige Eingaben, die Fließkommazahlen mit bis zu zehn Präzisionsziffern (in Dezimalzahlen) darstellen. Irgendwann muss ich im clientseitigen Validierungscode ein paar dieser Werte vergleichen, um zu sehen, ob sie gleich sind oder nicht, und hier, wie zu erwarten, scheitert die einfache Überprüfung der IEEE754 an Dingen wie (2.0000000000 == 2.0000000001) = wahr.Beliebige Genauigkeit Gleitkommazahlen auf JavaScript

Ich kann die Gleitkommazahl in zwei Longs für jede Seite des Punktes brechen, jede Seite 64 Bit lang machen und meine Vergleiche manuell machen, aber es sieht so hässlich aus!

Jede anständige Javascript-Bibliothek, um beliebige (oder zumindest garantierte) Präzisions-Gleitkommazahlen auf Javascript zu behandeln?

Vielen Dank im Voraus!

PS: A GWT basierte Lösung hat einen ++

+0

Dieses Problem kann auf beliebigem beliebigem Genauigkeitsfließpunkt angezeigt werden, andernfalls legen Sie die Genauigkeit für Gleichheit fest. Dies ist die intrinsische Natur von Gleitkommazahlen. Verwenden Sie Festkommamathematik mit beliebiger Länge. – kirilloid

+0

@kirilloid natürlich kann es erscheinen, dachte nur, es war es wert, die Frage zu erarbeiten (in der Regel führt zu mehr ausgearbeitete Antworten). Danke trotzdem! – opsidao

Antwort

1

Es ist die GWT-MATH-Bibliothek bei http://code.google.com/p/gwt-math/.

Allerdings warne ich Sie, es ist ein GWT jsni Overlay von einem Java-> Javascript automatisierte Konvertierung von java.BigDecimal (eigentlich die alte com.ibm.math.BigDecimal).

Es funktioniert, aber es ist nicht schnell. (Auch nicht mager. Es wird gut 70k in Ihr Projekt packen).

An meinem Arbeitsplatz arbeiten wir an einem einfachen Dezimalkomma, aber noch nichts, was es wert wäre, freigegeben zu werden. :(

+1

sieht vielversprechend aus! Vielen Dank! (Ich glaube nicht, dass die Leistung ein Problem sein wird, ist nur zur Validierung, die echte Mathematik ist auf dem Server mit R;)) – opsidao

1

mit beliebiger Genauigkeit Integer-Bibliothek verwenden, wie silentmatt’s javascript-biginteger, die mit ganzen Zahlen von beliebiger Größe können speichern und berechnen.

Da Sie zehn Dezimalstellen wollen, werden Sie den Wert n als n×10^10 speichern müssen B. 1 als 10000000000 (zehn Nullen), 1.5 als 15000000000 (neun Nullen), etc. Um den Wert für den Benutzer anzuzeigen, platzieren Sie einfach einen Dezimalpunkt vor dem zehnten Zeichen (und dann schneiden Sie jeden aus abschließende Nullen, wenn Sie wollen.)

Alternativ Sie könnte einen Zähler und einen Nenner als BigInteger speichern, was Ihnen dann willkürlich genaue Bruchwerte erlaubt (aber Vorsicht - Bruchwerte werden sehr schnell sehr groß).

Verwandte Themen