iT邦幫忙

0

請問能用deciaml js替換原來js的+-*/符號功能?

  • 分享至 

  • xImage

因為要使用高精度計算,目前使用decimal js都要創建物件+呼叫方法,變得繁瑣
希望將以下方式

new Decimal(1).sub(new Decimal(2)).add(new Decimal(3)).mul(new Decimal(4.3)).div(new Decimal(4.1)) 

能改成符號又能兼顧精度

1-2+3*4.3/4.1 = 2.1463
淺水員 iT邦大師 6 級 ‧ 2023-11-03 17:30:17 檢舉
Javascript 本身的限制
應該是無法
但可以寫一個函數去解析字串並自動計算
例如 calculate("1-2+3*4.3/4.1") 這樣
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
淺水員
iT邦大師 6 級 ‧ 2023-11-03 19:41:55
最佳解答

搭配方程式解析函式庫: https://github.com/kgram/equation-parser

範例程式碼

<script src="./node_modules/decimal.js/decimal.js"></script>
<script type="module">
    import { parse } from './node_modules/equation-parser/dist/index.esm.js';
    
    function cal(equationString) {
        function calNode(equationNode) {
            switch(equationNode.type) {
                case 'number':
                    return new Decimal(equationNode.value);
                case 'plus':
                    return calNode(equationNode.a).plus(calNode(equationNode.b));
                case 'minus':
                    return calNode(equationNode.a).minus(calNode(equationNode.b));
                case 'multiply-dot':
                    return calNode(equationNode.a).mul(calNode(equationNode.b));
                case 'divide-fraction':
                    return calNode(equationNode.a).div(calNode(equationNode.b));
                default:
                    throw 'Unknow operator';
            }
        }
        let equationNode = parse(equationString);
        return calNode(equationNode).toString();
    }
    
    Decimal.set({ precision: 5, rounding: 4 });
    // 之後計算東西就呼叫 cal 即可,算式用字串傳入
    console.log(cal('1-2+3*4.3/4.1'));
</script>

我要發表回答

立即登入回答