web-dev-qa-db-ja.com

JavaScriptのBigDecimal

私はJavaScriptに非常に慣れていない(Java背景から来た)ので、少額のお金でいくつかの財務計算をしようとしています。

これの私の最初の行きは次のとおりでした:

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

これは、常に切り上げられる(Math.ceil)ことを除いて、うまく機能しました。 Math.floorにも同じ問題があり、Math.roundもフロートに適していません。

Javaでは、フロートの使用を完全に回避していましたが、JavaScriptでは、同等のものがデフォルトで含まれているようには見えません。

問題は、言及されているすべてのライブラリが壊れているか、別の目的で使用されていることです。 jsfromhell.com/classes/bignumberライブラリは必要なものに非常に近いですが、丸めと精度に奇妙な問題があります... Round Typeを何に設定しても、独自に決定するようです。したがって、たとえば、精度が2でROUND_HALF_UPの丸型の3.7107は、3.71であるべきところ、なんとか3.72に巻き上げられます。

@JasonSmith BigDecimalライブラリ(JavaのBigDecimalからの機械加工されたポート)も試しましたが、実行するオプションがないnode.jsのようです。

バニラJavaScriptを使用してこれをどのように達成できますか(そして信頼性があります)、または維持され、破損していない使用可能な最新の(上記のものはすべて古いものです)ライブラリがありますか?

18
SnakeDoc

数字、お金、通貨のフォーマットにaccounting.jsを使用するのが好きです。

ホームページ- https://openexchangerates.github.io/accounting.js/

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

7
John Strickler