36

私は 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 の 3.7107 で、丸型ROUND_HALF_UPが 3.71 であるべきところが、どういうわけか 3.72 になってしまいます。

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

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

4

5 に答える 5

0

@trincot の BigDecimal の優れた実装を NPM モジュールにラップし、BigInt ポリフィル JSBI および逆ポーランド記法アルゴリズムと組み合わせました。

このモジュールを使用すると、JS で任意の算術計算を実行することが非常に直感的になり、IE11 との互換性さえあります。

npm install jsbi-calculator

import JBC from "jsbi-calculator";

const { calculator } = JBC;

const expressionOne = "((10 * (24 / ((9 + 3) * (-2)))) + 17) + 5";
const resultOne = calculator(expressionOne);
console.log(resultOne);
// -> '12'

const max = String(Number.MAX_SAFE_INTEGER);
console.log(max);
// -> '9007199254740991'
const expressionTwo = `${max} + 2`;
const resultTwo = calculator(expressionTwo);
console.log(resultTwo);
// -> '9007199254740993'

これは npm ページへのリンクです。https://www.npmjs.com/package/jsbi-calculator .

@trincot のインスピレーションにもう一度感謝します。

于 2021-11-26T08:34:31.227 に答える