2010-01-21 13 views
5

Ho alcuni input sul mio sito che rappresentano numeri in virgola mobile con un massimo di dieci cifre di precisione (in decimale). Ad un certo punto, nel codice di convalida lato client, ho bisogno di confrontare un paio di quei valori per vedere se sono uguali o meno, e qui, come ci si aspetterebbe, le intrinseche di IEEE754 fanno sì che un semplice controllo fallisca con cose come (2.0000000000 == 2.0000000001) = true.Precisione arbitraria Numeri float su JavaScript

Posso rompere il numero in virgola mobile in due lunghezze per ciascun lato del punto, rendere ogni lato lungo 64 bit e fare i miei confronti manualmente, ma sembra così brutto!

Qualsiasi libreria Javascript decente per gestire numeri float di precisione arbitrari (o almeno garantiti) su Javascript?

Grazie in anticipo!

PS: Una soluzione basata GWT ha un ++

+0

Questo problema può apparire su QUALSIASI punto mobile di precisione arbitrario, altrimenti si imposta la precisione per l'uguaglianza. Questa è la natura intrinseca dei numeri in virgola mobile. Utilizzare la matematica punto fisso con lunghezza arbitraria. – kirilloid

+0

@kirilloid ovviamente potrebbe apparire, pensavo solo che valeva la pena elaborare la domanda (di solito porta a risposte più elaborate). Grazie comunque! – opsidao

risposta

1

C'è la biblioteca GWT-matematiche a http://code.google.com/p/gwt-math/.

Tuttavia, ti avverto, è una sovrapposizione jsni GWT di una conversione automatizzata java-> javascript di java.BigDecimal (in realtà il vecchio com.ibm.math.BigDecimal).

Funziona, ma non lo è. (Né magra, si inserirà su un buon 70k nel tuo progetto).

Sul posto di lavoro, stiamo lavorando su un decimale semplice a virgola fissa, ma non vale ancora la pena di rilasciare. :(

+1

sembra promettente! Grazie! (Non penso che le prestazioni saranno un problema, è solo per la convalida, la vera matematica viene eseguita sul server usando R;)) – opsidao

1

Utilizzare una libreria intero precisione arbitraria, come silentmatt’s javascript-biginteger, che può immagazzinare e calcolare con numeri interi di qualsiasi dimensione arbitraria.

Dal momento che si desidera dieci cifre decimali, è necessario memorizzare il valore n come n×10^10 Ad esempio, memorizzare come 10000000000 (dieci zeri), 1.5 come 15000000000 (nove zeri), ecc. Per visualizzare il valore per l'utente, è sufficiente posizionare un punto decimale davanti al decimo carattere (e quindi tagliare qualsiasi zero finale se si desidera)

In alternativa potrebbe memorizzare un numeratore e un denominatore come biginteger, il che consentirebbe quindi valori frazionari arbitrariamente precisi (ma attenzione: i valori frazionari tendono a diventare molto grandi molto rapidamente).

Problemi correlati