2013-05-24 15 views
6

Sono molto nuovo in JavaScript (provengo da uno sfondo Java) e sto cercando di fare alcuni calcoli finanziari con piccole somme di denaro.BigDecimal in JavaScript

mio go originale a questo è stato:

<script type="text/javascript"> 
    var normBase = ("[price]").replace("$", ""); 
    var salesBase = ("[saleprice]").replace("$", ""); 
    var base; 
    if (salesBase != 0) { 
     base = salesBase; 
    } else { 
     base = normBase; 
    } 
    var per5 = (base - (base * 0.05)); 
    var per7 = (base - (base * 0.07)); 
    var per10 = (base - (base * 0.10)); 
    var per15 = (base - (base * 0.15)); 
    document.write 
     (
     '5% Off: $' + (Math.ceil(per5 * 100)/100).toFixed(2) + '<br/>' + 
     '7% Off: $' + (Math.ceil(per7 * 100)/100).toFixed(2) + '<br/>' + 
     '10% Off: $' + (Math.ceil(per10 * 100)/100).toFixed(2) + '<br/>' + 
     '15% Off: $' + (Math.ceil(per15 * 100)/100).toFixed(2) + '<br/>' 
    ); 
</script> 

Questo ha funzionato bene, tranne che sempre arrotondato per eccesso (Math.ceil). Math.floor ha lo stesso problema e Math.round non va bene per i float.

In Java, avrei evitato l'uso di float completamente dal get-go, tuttavia in JavaScript non sembra esserci un'inclusione predefinita di qualcosa di simile (OMG WHY!?!?!?!).

Quindi, il mio SO-fu mi ha portato a questo post: https://stackoverflow.com/questions/744099/is-there-a-good-javascript-bigdecimal-library

Il problema è, tutte le librerie di cui sono o rotti o per uno scopo diverso. La libreria jsfromhell.com/classes/bignumber è molto simile a quella di cui ho bisogno, tuttavia ho problemi bizzarri con il suo arrotondamento e la precisione ... Non importa a cosa imposto il tipo di round, sembra decidere da solo. Ad esempio, 3.7107 con precisione di 2 e tipo rotondo di ROUND_HALF_UP termina in qualche modo come 3.72 quando dovrebbe essere 3.71.

Ho anche provato la libreria @JasonSmith BigDecimal (una porta elaborata dal BigDecimal di Java), ma sembra essere per node.js che non ho la possibilità di eseguire.

Come posso realizzare questo utilizzando JavaScript vaniglia (ed essere affidabile) oppure esiste una libreria moderna (quelle citate sopra hanno tutti anni ora) che posso usare che viene mantenuta e non è rotta?

+1

ho appena avuto il mio "!?!?!?! OMG PERCHE '" momento ieri :) – rubiii

+0

Ho i miei momenti OMG ogni giorno in JS su questo. – user1567291

risposta

4

Mi piace usare accounting.js per la formattazione di numeri, denaro e valuta.

Homepage - https://openexchangerates.github.io/accounting.js/

Github-https://github.com/openexchangerates/accounting.js

+0

+1 Sembra promettente! Grazie, farò un tentativo. – SnakeDoc

+1

Buona fortuna! Non dovresti essere deluso. –

+0

Ha funzionato come un incantesimo e esattamente come previsto! Grazie ancora. (Ora è sufficiente ottenere JavaScript per includere qualcosa di simile per impostazione predefinita!) – SnakeDoc