js浮点数的加减乘除问题

原因

因为计算机内部的信息都是由二进制方式表示的,即0和1组成的各种编码,但由于某些浮点数没办法用二进制准确的表示出来,也就带来了一系列精度问题。当然这也不是JS独有的问题。

解决办法

1. 使用math.js

Math.js是一个用于JavaScript和Node.js的扩展数学库。它具有支持符号计算的灵活表达式解析器,大量内置函数和常量,并提供了集成的解决方案来处理不同的数据类型,例如数字,大数,复数,分数,单位和矩阵,强大且易于使用。

2. 封装方法(挂载再vue实例下)

// 乘法
Vue.prototype.NumberMul = function(arg1, arg2) {
    var m = 0;
    var s1 = arg1.toString();
    var s2 = arg2.toString();
    try {
        m += s1.split(".")[1].length;
    } catch (e) {}
    try {
        m += s2.split(".")[1].length;
    } catch (e) {}
 
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}

// 加法
Vue.prototype.NumberAdd = function(arg1, arg2) {
    var r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length
    } catch (e) {
        r1 = 0
    }
    try {
        r2 = arg2.toString().split(".")[1].length
    } catch (e) { 
        r2 = 0 
    } 
    m = Math.pow(10, Math.max(r1, r2))
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m + arg2 * m) / m).toFixed(n);
}

// 减法
Vue.prototype.NumberSub = function(arg1, arg2) {
    var re1, re2, m, n;
    try {
        re1 = arg1.toString().split(".")[1].length;
    } catch (e) {
    re1 = 0;
    }
    try {
        re2 = arg2.toString().split(".")[1].length;
    } catch (e) {
        re2 = 0;
    }
    m = Math.pow(10, Math.max(re1, re2)); 
    n = (re1 >= re2) ? re1 : re2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

// 除数,被除数, 保留的小数点后的位数
Vue.prototype.NumberDiv = function (arg1,arg2,digit){
    var t1=0,t2=0,r1,r2;
    try{t1=arg1.toString().split(".")[1].length}catch(e){}
    try{t2=arg2.toString().split(".")[1].length}catch(e){}
    r1=Number(arg1.toString().replace(".",""))
    r2=Number(arg2.toString().replace(".",""))
    //获取小数点后的计算值
   var result= ((r1/r2)*Math.pow(10,t2-t1)).toString()
    var result2=result.split(".")[1];
    result2=result2.substring(0,digit>result2.length?result2.length:digit);
 
    return Number(result.split(".")[0]+"."+result2);
}

// 使用方法

{{NumberMul(0.0058,100)}}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是用 JavaScript 编写的精准计算加减乘除的代码: ```javascript function add(a, b) { let maxLength = Math.max(a.length, b.length); a = a.padStart(maxLength, '0'); b = b.padStart(maxLength, '0'); let carry = 0; let result = ''; for (let i = maxLength - 1; i >= 0; i--) { let sum = parseInt(a[i]) + parseInt(b[i]) + carry; carry = Math.floor(sum / 10); result = (sum % 10) + result; } if (carry > 0) { result = carry + result; } return result; } function subtract(a, b) { let maxLength = Math.max(a.length, b.length); a = a.padStart(maxLength, '0'); b = b.padStart(maxLength, '0'); let borrow = 0; let result = ''; for (let i = maxLength - 1; i >= 0; i--) { let diff = parseInt(a[i]) - parseInt(b[i]) - borrow; if (diff < 0) { diff += 10; borrow = 1; } else { borrow = 0; } result = diff + result; } return result.replace(/^0+/, ''); } function multiply(a, b) { let result = '0'; for (let i = b.length - 1; i >= 0; i--) { let carry = 0; let tempResult = ''; for (let j = a.length - 1; j >= 0; j--) { let product = parseInt(b[i]) * parseInt(a[j]) + carry; carry = Math.floor(product / 10); tempResult = (product % 10) + tempResult; } if (carry > 0) { tempResult = carry + tempResult; } tempResult = tempResult.padEnd(tempResult.length + (b.length - 1 - i), '0'); result = add(result, tempResult); } return result.replace(/^0+/, ''); } function divide(a, b) { if (b === '0') { throw new Error('除数不能为0'); } if (a === '0') { return '0'; } let remainder = ''; let quotient = ''; for (let i = 0; i < a.length; i++) { remainder += a[i]; let tempQuotient = '0'; while (compare(remainder, b) >= 0) { remainder = subtract(remainder, b); tempQuotient = add(tempQuotient, '1'); } quotient += tempQuotient; } return quotient.replace(/^0+/, ''); } function compare(a, b) { let maxLength = Math.max(a.length, b.length); a = a.padStart(maxLength, '0'); b = b.padStart(maxLength, '0'); for (let i = 0; i < maxLength; i++) { if (a[i] > b[i]) { return 1; } else if (a[i] < b[i]) { return -1; } } return 0; } ``` 这段代码实现了精准计算加减乘除的功能,可以在 JavaScript 环境中直接使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

回忆哆啦没有A梦

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值