众所周知,js的小数乘法很容易丢失精度,这是一件很恶心的事情。
所以我写了这个方法,保证计算精度。
/**
* js小数乘法
*@parameter arg1:被乘数(接受小数和整数)
*@parameter arg2:乘数(接受小数和整数)
*@parameter fix: 乘积保留几位(接受正负整数以及0)
*/
function accMul(arg1,arg2,fix) {
if(!parseInt(fix)==fix)
{
return;
}
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){}
if(m>fix){
return (Math.round(Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m-fix))/Math.pow(10,fix));
}else if(m<=fix){
return (Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)).toFixed(fix);
}else{
return (arg1*arg2).toFixed(fix);
}
}

另外附上 我的测试用例,不全或者有误的地方,欢迎指点批评,谢谢!
document.writeln("3472.45*0.3 = 1041.735 保留2位: "+accMul(3472.45, 0.3,2)+"<br/>");
document.writeln("3472.45*0.3 = 1041.735 保留1位"+accMul(3472.45, 0.3,1)+"<br/>");
document.writeln("3472.45*0.3 = 1041.735 保留0位"+accMul(3472.45, 0.3,0)+"<br/>");
document.writeln("3472.45*0.3 = 1041.735 保留-1位"+accMul(3472.45, 0.3,-1)+"<br/>");
document.writeln("347245*0.3 = 104173.5 保留2位"+accMul(347245, 0.3,2)+"<br/>");
document.writeln("347245*0.3 = 104173.5 保留1位"+accMul(347245, 0.3,1)+"<br/>");
document.writeln("347245*0.3 = 104173.5 保留0位"+accMul(347245, 0.3,0)+"<br/>");
document.writeln("347245*0.3 = 104173.5 保留-1位"+accMul(347245, 0.3,-1)+"<br/>");
document.writeln("347245*3 = 1041735 保留2位"+accMul(347245, 3,2)+"<br/>");
document.writeln("347245*3 = 1041735 保留1位"+accMul(347245, 3,1)+"<br/>");
document.writeln("347245*3 = 1041735 保留0位"+accMul(347245, 3,0)+"<br/>");
document.writeln("347245*3 = 1041735 保留-1位"+accMul(347245, 3,-1)+"<br/>");
document.writeln("0.5*0.3 = 0.15 保留3位"+accMul(0.5, 0.3,3)+"<br/>");
document.writeln("0.5*0.3 = 0.15 保留2位"+accMul(0.5, 0.3,2)+"<br/>");
document.writeln("0.5*0.3 = 0.15 保留1位"+accMul(0.5, 0.3,1)+"<br/>");
document.writeln("0.5*0.3 = 0.15 保留0位"+accMul(0.5, 0.3,0)+"<br/>");
document.writeln("0.5*0.3 = 0.15 保留-1位"+accMul(0.5, 0.3,-1)+"<br/>");
document.writeln("0.5*0.3 = 0.15 保留-2位"+accMul(0.5, 0.3,-2)+"<br/>");
document.writeln("0.5*0.3 = 0.15 保留-3位"+accMul(0.5, 0.3,-3)+"<br/>");

  

Javascript保证精度的小数乘法的更多相关文章

  1. javascript保留两位小数

      原文地址http://blog.csdn.net/he20101020/article/details/8503308   <script type="text/javascrip ...

  2. JavaScript 保留两位小数

    以下我们将为大家介绍 JavaScript 保留两位小数的实现方法: 四舍五入 以下处理结果会四舍五入: var num =2.446242342; num = num.toFixed(2); // ...

  3. js(javascript)取float型小数点后两位数的方法

    以下我们将为大家介绍 JavaScript 保留两位小数的实现方法:四舍五入以下处理结果会四舍五入: ? 1 2 var num =2.446242342; num = num.toFixed(2); ...

  4. 【转】javascript 小数乘法结果错误处理

    一.用js计算 12.32 * 7  结果是多少? 答案:86.24000000000001   为什么会出现这种问题?怎么解决? js在处理小数的乘除法的时候有一个bug,解决的方法可以是:将小数变 ...

  5. javascript小数乘法精确率问题

    做前端页面开发的经常会遇到数值的乘法计算,带小数位计算会出现值溢出的问题,如: JS里做小数的乘法运算时会出现浮点错误,具体可以测试一下: <script>alert(11*22.9)&l ...

  6. JavaScript数字精度丢失问题总结

    本文分为三个部分 JS 数字精度丢失的一些典型问题 JS 数字精度丢失的原因 解决方案(一个对象+一个函数) 一.JS数字精度丢失的一些典型问题 1. 两个简单的浮点数相加 0.1 + 0.2 != ...

  7. JavaScript数字精度上代码。

    /**不能超过 9007199254740992 * floatObj 包含加减乘除四个方法,能确保浮点数运算不丢失精度 * * 我们知道计算机编程语言里浮点数计算会存在精度丢失问题(或称舍入误差), ...

  8. 关于 JavaScript 的 精度丢失 与 近似舍入

    一.背景 最近做 dashborad 图表时,涉及计算小数且四舍五入精确到 N 位.后发现 js 算出来的结果跟我预想的不一样,看来这里面并不简单-- 二.JS 与 精度 1.精度处理 首先明确两点: ...

  9. Javascript 截取2位小数

    今天在处理数据时,前台界面金额需要保留两位小数,所以只能使用Javascript 来进行截取. var regex = /([0-9]+\.[0-9]{2})[0-9]*/; var localMon ...

随机推荐

  1. DB2常用命令2

    1.启动实例(db2inst1):实例相当于informix中的服务 db2start 2.停止实例(db2inst1): db2stop 3.列出所有实例(db2inst1) db2ilist 4. ...

  2. HashMap 实现原理

    深入Java集合学习系列:HashMap的实现原理   参考文献 引用文献:深入Java集合学习系列:HashMap的实现原理,大部分参考这篇博客,只对其中进行稍微修改 自己曾经写过的:Hashmap ...

  3. MySQL Join 的实现原理

    在寻找Join 语句的优化思路之前,我们首先要理解在MySQL 中是如何来实现Join 的,只要理解了实现原理之后,优化就比较简单了.下面我们先分析一下MySQL 中Join 的实现原理.在MySQL ...

  4. py-oauth2包使用简记

    接前两天线上项目py2升级py3的书,老廖的一个旧库snspy,他已经不维护了,用的api又比较久,不好升级,最后速度找了个OAuth库取代了它,由于时间紧张,直接在pypi上搜索了一下,找到这个支持 ...

  5. python笔记:#010#运算符

    运算符 目标 算数运算符 比较(关系)运算符 逻辑运算符 赋值运算符 运算符的优先级 数学符号表链接:https://zh.wikipedia.org/wiki/数学符号表 01. 算数运算符 是完成 ...

  6. Kafka安装之 Zookeeper

    一 . Zookeeper 概述        ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它 ...

  7. Oracle数据库表分区

    一.Oracle数据库表分区概念和理解         1.1.已经存在的表没有方法可以直接转化为分区表.         1.2.不在分区字段上建立分区索引,在别的字段上建立索引相当于全局索引.效率 ...

  8. PAT1037:Magic Coupon

    1037. Magic Coupon (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The magi ...

  9. 【转】mysql 中int类型字段unsigned和signed的区别

    转自https://www.cnblogs.com/wangzhongqiu/p/6424827.html 用法: mysql> CREATE TABLE t ( a INT UNSIGNED, ...

  10. Linux kernel的中断子系统之(八):softirq

    返回目录:<ARM-Linux中断系统>. 总结:中断分为上半部和下半部,上半部关中断:下半部开中断,处理可以延迟的事情.下半部有workqueue/softirq/tasklet三种方式 ...