2013-05-24 6 views
6

Ich bin sehr neu in JavaScript (ich komme aus einem Java-Hintergrund) und ich versuche, einige finanzielle Berechnungen mit kleinen Geldbeträgen zu machen.BigDecimal in JavaScript

Meine ursprüngliche gehen an war:

<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> 

Das funktionierte gut, außer es immer aufzurunden (Math.ceil). Math.floor hat das gleiche Problem, und Math.round ist auch nicht gut für Floats.

In Java hätte ich die Verwendung von Floats komplett von Anfang an vermieden, aber in JavaScript scheint es keine standardmäßige Aufnahme von etwas Vergleichbarem zu geben (OMG WARUM!?!?!?!).

Also, mein SO-fu hat mich zu diesem Beitrag führt: https://stackoverflow.com/questions/744099/is-there-a-good-javascript-bigdecimal-library

Das Problem ist, alle Bibliotheken entweder gebrochen oder für einen anderen Zweck erwähnt werden. Die jsfromhell.com/classes/bignumber-Bibliothek ist sehr nah an dem, was ich brauche, aber ich habe bizarre Probleme mit ihrer Rundung und Präzision ... Egal, was ich den Round-Typ festlegen, scheint es allein zu entscheiden. So zum Beispiel 3.7107 mit der Genauigkeit von 2 und runden Typ von ROUND_HALF_UP irgendwie wie 3.72 wenn es 3.71 sein sollte.

Ich versuchte auch @JasonSmith BigDecimal-Bibliothek (ein bearbeiteter Port von Java BigDecimal), aber es scheint für node.js zu sein, die ich nicht die Möglichkeit habe zu laufen.

Wie kann ich dies mit Vanilla JavaScript (und zuverlässig sein) oder gibt es eine moderne (die oben genannten sind alle Jahre alt) Bibliothek, die ich verwenden kann, die beibehalten wird und nicht kaputt ist?

+1

Ich hatte gerade meine "!?!?!?! OMG WARUM" Moment gestern :) – rubiii

+0

Ich habe meine OMG Momente jeden Tag in JS dazu. – user1567291

Antwort

4

Ich verwende gerne accounting.js für die Formatierung von Zahlen, Geld und Währungen.

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

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

+0

+1 Das sieht vielversprechend aus! Danke, ich werde es versuchen. – SnakeDoc

+1

Viel Glück! Du solltest nicht enttäuscht sein. –

+0

Arbeitete wie ein Charme und genau wie erwartet! Danke nochmal. (Nun, um JavaScript nur so zu bekommen, dass es so etwas standardmäßig enthält!) – SnakeDoc