加减乘除运算的精度问题解决方法

Var a=1234.56; var b =567.89;

如果不做处理调用 a+b =1802.99999…..8;

 

正确处理:

dcmAdd(a,b) =1802.45;

或者a.add(b) =1802.45;

 

 

MathUtil.js

//浮点数相加

function dcmAdd(arg1,arg2){

    var r1,r2,m;

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

    return (dcmMul(arg1,m)+dcmMul(arg2,m))/m;

}

//浮点数相减

function dcmSub(arg1,arg2){

     return dcmAdd(arg1,-arg2);

}

//浮点数相乘

function dcmMul(arg1,arg2){

    var m=0,s1=arg1.toString(),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);

}

//浮点数除

function dcmDiv(arg1,arg2){

    return dcmMul(arg1,1/arg2);

}

 

Number.prototype.add = function (arg){

                   return dcmAdd(this, arg);

}

Number.prototype.sub = function (arg){

                   return dcmSub(this, arg);

}

 

Number.prototype.mul = function (arg){

                   return dcmMul(this, arg);

}

Number.prototype.div = function (arg){

                   return dcmDiv(this, arg);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BigDecimal 是 Java 中用于处理精度问题的类,但是在进行加减乘除运算时,也需要注意精度问题。 1. 加减法精度问题 在进行 BigDecimal 的加减法运算时,需要注意两个 BigDecimal 对象的精度是否相同。如果两个 BigDecimal 对象的精度不同,那么结果的精度可能会有误差。 例如,假设有两个 BigDecimal 对象: BigDecimal a = new BigDecimal("10.123456789"); BigDecimal b = new BigDecimal("0.000000001"); 如果对它们进行加法运算,结果应该是 10.123456790。但是,如果直接使用 a.add(b),会得到一个不精确的结果: BigDecimal c = a.add(b); // 结果可能是 10.123456789 这是因为 a 和 b 的精度不同,导致加法运算时精度丢失。解决方法是将两个 BigDecimal 对象的精度都设置为相同的值,如下所示: BigDecimal a = new BigDecimal("10.123456789").setScale(9, RoundingMode.HALF_UP); BigDecimal b = new BigDecimal("0.000000001").setScale(9, RoundingMode.HALF_UP); BigDecimal c = a.add(b); // 结果为 10.123456790 在这里,使用了 setScale 方法将 a 和 b 的精度都设置为 9,同时使用了 RoundingMode.HALF_UP 舍入模式来保证精度。 2. 乘除法精度问题 在进行 BigDecimal 的乘除法运算时,也可能会出现精度问题。例如,假设有两个 BigDecimal 对象: BigDecimal a = new BigDecimal("10.0"); BigDecimal b = new BigDecimal("3.0"); 如果对它们进行除法运算,结果应该是 3.3333333333。但是,如果直接使用 a.divide(b),会得到一个不精确的结果: BigDecimal c = a.divide(b); // 结果可能是 3.333333333 这是因为 BigDecimal 的除法运算默认是保留整数部分,精度有可能丢失。解决方法是使用重载的 divide 方法,指定要保留的小数位数和舍入模式,如下所示: BigDecimal c = a.divide(b, 10, RoundingMode.HALF_UP); // 结果为 3.3333333333 在这里,使用了保留 10 位小数和 RoundingMode.HALF_UP 舍入模式来保证精度。乘法运算也可以使用 setScale 方法来设置精度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值