js 加减乘除

### JavaScript中的精确加减乘除实现 在JavaScript中进行数值计算时,经常会出现不精确的情况,尤其是涉及到小数运算时更为明显。这是因为JavaScript中的数字是以IEEE 754双精度浮点数(64位)格式存储的,这种格式虽然可以提供较大的数值范围,但在某些情况下会导致精度损失。为了解决这个问题,我们需要设计一套方法来确保加减乘除等基本运算的准确性。 #### 一、问题现象与原因分析 1. **现象**:在JavaScript中执行如`0.1 + 0.2`这样的简单运算时,结果不是预期的`0.3`,而是`0.30000000000000004`。 2. **原因**: - 浮点数的二进制表示无法完全精确地表示所有十进制分数,导致了这种误差。 - IEEE 754标准规定了如何将十进制数转换为二进制形式,并进行了舍入处理,这可能导致实际值与期望值之间存在微小差异。 #### 二、解决方案 为了提高计算的准确性,我们可以采用以下几种方法: 1. **字符串处理法**:通过将数字转换成字符串,消除浮点数的精度问题。 2. **整数运算法**:先将参与运算的数字转换为整数,完成运算后再根据需要恢复小数点位置。 3. **自定义函数法**:编写专门的函数来处理加减乘除运算,确保结果的准确性。 下面详细介绍每种方法的具体实现。 #### 三、自定义函数实现 1. **加法**:`accAdd` ```javascript function accAdd(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 (arg1 * m + arg2 * m) / m; } ``` 这个函数首先计算两个参数的小数位数,然后将这两个数分别乘以相应的10的幂次方,使其变为整数,相加后再次除以相同的幂次方,从而得到准确的结果。 2. **减法**:可以通过修改上述`accAdd`函数实现,具体实现略。 3. **乘法**:`accMul` ```javascript function accMul(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); } ``` 此函数首先统计两个数的小数位数总和,再将两个数都转换为整数进行相乘,最后将结果除以10的总小数位数幂次方。 4. **除法**:`accDiv` ```javascript function accDiv(arg1, arg2) { 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) {} with (Math) { r1 = Number(arg1.toString().replace(".", "")); r2 = Number(arg2.toString().replace(".", "")); return (r1 / r2) * pow(10, t2 - t1); } } ``` 该函数的工作原理与乘法类似,但需要额外考虑除法运算中可能出现的小数位数不一致的问题。 #### 四、扩展应用 1. **原型扩展**:为了方便使用,还可以对`Number`原型对象进行扩展,例如: ```javascript Number.prototype.mul = function (arg) { return accMul(arg, this); }; Number.prototype.add = function (arg) { return accAdd(arg, this); }; ``` 这样可以直接调用`7.mul(0.8)`来得到更精确的结果。 #### 五、总结 通过上述方法,我们可以有效地解决JavaScript中小数运算不精确的问题。这些自定义函数不仅可以用于简单的数学计算,还可以作为基础工具应用于更复杂的业务逻辑中,提高程序的整体质量。










37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数)
我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998
怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。
我Google了一下,发现原来这是JavaScript浮点运算的一个bug。
比如:7*0.8 JavaScript算出来就是:5.6000000000000005
解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数。
下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:
程序代码
//除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(arg1,arg2){
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){}
with(Math){
r1=Number(arg1.toString().replace(".",""))
r2=Number(arg2.toString().replace(".",""))
return (r1/r2)*pow(10,t2-t1);
}
}
//给Number类型增加一个div方法,调用起来更加方便。
Number.prototype.div = function (arg){
return accDiv(this, arg);
}

- HTMLzuo2014-12-30不错是不错 但是不是我想要的~

- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- C语言课后答案.doc
- 数控机床软件界面人的因素分析(1).docx
- 电力系统自动化硕士生培养方案.doc
- 专题资料(2021-2022年)01ORACLEEBS组织架构介绍详细r12.docx
- 网络营销实例分析综合应用.pptx
- 液体的压强+flash.ppt
- northstar-Java资源
- 基于PLC立体车库控制系统的设计.doc
- 培训讲义:通信行业技术人员的KPI设定与分解方法(ppt-127)-.pptx
- 网络安全-防火墙.ppt
- 通信公司承载网实施配置规范.doc
- 十进制和二进制相互转化程序设计书.doc
- 网络安全宣传周心得感悟.doc
- 网络工程设计培训课程.pptx
- 招标师考试辅导教员培训大纲《项目管理与招标采购》.ppt
- 新版中学网络安全教育PPT课件.pptx


