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?
ho appena avuto il mio "!?!?!?! OMG PERCHE '" momento ieri :) – rubiii
Ho i miei momenti OMG ogni giorno in JS su questo. – user1567291