2009-12-16 6 views
10

Sto costruendo una webapp usando JQuery, Stripes, Spring e JPA (Hibernate).Devo fare calcoli monetari in Javascript o come una chiamata AJAX?

Ho una pagina che consente agli utenti di immettere un numero di elementi pubblicitari dell'ordine e ogni volta che si verifica onblur nel campo del prezzo, ho un evento JQuery associato al campo che somma tutti i campi del prezzo (questo è un subtotale) , calcola il 10% di tasse e aggiunge la tassa al subtotale. Aggiorno la pagina per visualizzare il subtotale, la tassa e il totale generale.

La mia domanda è, devo fare questo calcolo in Javascript? In tal caso, come posso essere sicuro che l'arrotondamento ecc funzioni correttamente? Sono un po 'preoccupato per i problemi di precisione.

Sarebbe meglio per me effettuare una chiamata Ajax per eseguire il calcolo in Java?

Qualsiasi consiglio sarebbe fantastico!

risposta

15

Come regola generale, è necessario misurare ciò che è importante per l'applicazione. Se è assoluta precisione, fallo come una chiamata AJAX perché potrebbero esserci differenze di arrotondamento tra browser, computer e sistema operativo.

Quando stavo sviluppando un sito per un'azienda per cui lavoravo, ho avuto lo stesso problema, tuttavia riusciamo a utilizzare la parte javascript usando una svolta intelligente utilizzando solo aritmetica intera.

Perché avevamo a che fare con la valuta con due cifre, abbiamo moltiplicato tutto per 10.000 e abbiamo fatto i calcoli. Arrotondare al numero intero e diviso per 10.000 troncando il risultato a due cifre decimali.

Ciò rende i viaggi di andata e ritorno piacevolmente e coerentemente tra il browser e il lato server.

+1

+ 1 da parte mia Paulo. Non sapevo che JS avesse problemi di precisione con i calcoli aritmetici – ram

+1

Ram, ECMAScript utilizza calcoli float veloci ma imprecisi. Ad esempio, '.1 + .2 = 0.30000000000000004'. Anche ECMAScript 5 avrà questi problemi, perché il sistema di precisione proposto è stato giudicato troppo problematico (molto lento e potrebbe interrompere le applicazioni esistenti) per lo standard. Ci vorranno ancora un paio d'anni prima che un sistema preciso sia addirittura standardizzato, per non parlare di quello disponibile. – eyelidlessness

+0

In procinto di dare lo stesso consiglio! –

0

Javascript non è la lingua migliore per fare matematica con. Troverai alcune espressioni matematiche che sono vere ma restituiscono false in Javascript. Non riesco a ricordarli esattamente, ma ho scoperto quando ho fatto una calcolatrice una volta.

È possibile scoprire le parti buone e cattive di Javascript qui: http://www.crockford.com/

+1

Non è davvero niente di speciale su JavaScript. Qualsiasi lingua che utilizza IEEE 754 numeri in virgola mobile (quasi tutto) ha gli stessi problemi. –

2

si dovrebbe fare sul lato client (presumo che avete i vostri validatori lato client in posizione) in modo tale che l'utente può vedere il totale (vorrei odiare se effettuiamo chiamate di andata e ritorno al server per vedere solo il totale) e farlo anche sul lato server. Leggere i valori dal POST non sarebbe una buona idea dato che qualcuno con un HTTPProxy potrebbe cambiare questi valori se lo stai prelevando dal tuo POST HTTP.

TamperIE uno strumento per manomettere HTTP GET e POST e un sandbox dove si può giocare con

Edit: Sì, è possibile fare il calcolo nel server effettuando una chiamata AJAX, ma si avrebbe bisogno di convalidare il totale comunque (rispetto al numero di prodotti + tasse) quando l'utente invia l'ordine

3

Se si accettano ordini, si consiglia di eseguire sempre i calcoli sul lato server prima di confermare l'ordine per evitare che qualcuno possa manipolare maliziosamente i dati inviati dal client. Detto questo, è possibile eseguire l'aggiornamento dinamico utilizzando JavaScript con una dichiarazione di non responsabilità debitamente formulata sulla precisione e quindi presentare l'utente con il calcolo sul lato server prima di confermare l'ordine.

6

Per il comp.lang.javascript FAQ, Javascript utilizza IEEE-754 e quindi ha una precisione di 15-16 cifre quando si esegue la matematica in virgola mobile. Questo dovrebbe essere sufficiente per le operazioni monetarie, purché tu usi lo stesso arrotondamento in Javascript che fai sul lato server.

Ma se è necessario essere assolutamente sicuri che sia corretto su qualsiasi e tutti i browser, una chiamata Ajax sarebbe la linea di condotta più sicura.

0

Si dovrebbe utilizzare il back-end, nel caso si tratti di Java, per eseguire calcoli rigorosi poiché non vi è alcuna garanzia che i dati non vengano manomessi dall'utente finale a proprio vantaggio. E dopo aver inviato loro una conferma del prezzo manomesso, sei essenzialmente vincolato ai termini del contratto di acquisto, anche se sai di aver manomesso il prezzo totale. Non esiste un modo semplice per dimostrare di aver manomesso il codice o i calcoli e, a sua volta, non sarà possibile. Usa il back-end, hai il pieno controllo di quell'ambiente, eventuali errori o errori di calcolo da quell'angolazione possono essere incolpati direttamente su di te.

0

Anche se questa non è una domanda SO (lo scambio è il posto migliore, immagino), non lo userei nei calcoli aritmetici a meno che non ci sia davvero bisogno. Se i punti decimali sono coinvolti, le sirene sono allarmati ...

Per esempio, lo sapevate che:

0.1 + 0.2 = 0.30000000000000004 

quindi se effettivamente controllare come 0.1 + 0.2 === 0.3 sarà false

Or qui è la migliore:

  • typeof NaN è il numero NaN != NaN è true. MA NaN !== NaN anche true

E qui è il mio preferito:

var i = 1; 
i = i + ""; 
i + 1 //output will be "11" :) 
console.log(i);//output will be 1 
i - 1 = 0; // this part is the golden shot 

Anche se io non sono d'accordo al 100% con il seguente articolo, Consiglierei assolutamente da leggere:

The Top 10 Things Wrong with JavaScript

Ha punti davvero interessanti.

+0

ma sai che queste 10 cose "sbagliate" in realtà rendono javascript dinamico e adatto allo sviluppo di tipi dinamici come in phython? – vibs2006

+0

@ vibs2006: dinamico non significa incoerente ... comunque non ho intenzione di discutere, questo è un articolo che è buono da leggere anche se non sono d'accordo al 100% .. che dice solo che devi sapere cosa stai facendo con javascript .. come una profonda comprensione di esso.A proposito, mi piacerebbe davvero capire come 0.2 + 0.1! = 0.3 lo rende "più dinamico" e "più adatto" – curiousBoy

Problemi correlati