Javascript保证精度的小数乘法
众所周知,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保证精度的小数乘法的更多相关文章
- javascript保留两位小数
原文地址http://blog.csdn.net/he20101020/article/details/8503308 <script type="text/javascrip ...
- JavaScript 保留两位小数
以下我们将为大家介绍 JavaScript 保留两位小数的实现方法: 四舍五入 以下处理结果会四舍五入: var num =2.446242342; num = num.toFixed(2); // ...
- js(javascript)取float型小数点后两位数的方法
以下我们将为大家介绍 JavaScript 保留两位小数的实现方法:四舍五入以下处理结果会四舍五入: ? 1 2 var num =2.446242342; num = num.toFixed(2); ...
- 【转】javascript 小数乘法结果错误处理
一.用js计算 12.32 * 7 结果是多少? 答案:86.24000000000001 为什么会出现这种问题?怎么解决? js在处理小数的乘除法的时候有一个bug,解决的方法可以是:将小数变 ...
- javascript小数乘法精确率问题
做前端页面开发的经常会遇到数值的乘法计算,带小数位计算会出现值溢出的问题,如: JS里做小数的乘法运算时会出现浮点错误,具体可以测试一下: <script>alert(11*22.9)&l ...
- JavaScript数字精度丢失问题总结
本文分为三个部分 JS 数字精度丢失的一些典型问题 JS 数字精度丢失的原因 解决方案(一个对象+一个函数) 一.JS数字精度丢失的一些典型问题 1. 两个简单的浮点数相加 0.1 + 0.2 != ...
- JavaScript数字精度上代码。
/**不能超过 9007199254740992 * floatObj 包含加减乘除四个方法,能确保浮点数运算不丢失精度 * * 我们知道计算机编程语言里浮点数计算会存在精度丢失问题(或称舍入误差), ...
- 关于 JavaScript 的 精度丢失 与 近似舍入
一.背景 最近做 dashborad 图表时,涉及计算小数且四舍五入精确到 N 位.后发现 js 算出来的结果跟我预想的不一样,看来这里面并不简单-- 二.JS 与 精度 1.精度处理 首先明确两点: ...
- Javascript 截取2位小数
今天在处理数据时,前台界面金额需要保留两位小数,所以只能使用Javascript 来进行截取. var regex = /([0-9]+\.[0-9]{2})[0-9]*/; var localMon ...
随机推荐
- 学习Spring Boot
Spring boot 是什么 ? 简单说, spring boot 是一个构建项目的工具, 一个脚手架. Spring boot 能干什么? spring boot 做非常少的配置就可以构建生产级别 ...
- 通过slave_exec_mode=IDEMPOTENT跳过主从复制中的错误
通过slave_exec_mode=IDEMPOTENT跳过主从复制中的错误 set global slave_exec_mode=IDEMPOTENT slave_exec_mode 有两种模式 S ...
- 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)
计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为 ...
- Storyboard中ViewController加载的四种方式
这个总结来自于<Programming iOS 10>一书: 1.storyboard的初始化ViewController,通过方法instantiateInitialViewContro ...
- PHP合并数组的三种方法的分析与比较
常用的合并数组的方法有三种:array_merge().array_merge_recursive().+,下面一个一个介绍 array_merge() 此函数合并一个或多个数组,当输入的数组中有相同 ...
- 五分钟学会centos配置gitlab
下载gitlab 亲测: centos6.5 安装依赖包: : yum install curl policycoreutils policycoreutils-python openssh-serv ...
- java web 实战经典(二)
一.jsp之间传值时乱码问题解决 request.setCharacterEncoding("GBK");//解决中文乱码 String postData = (String)re ...
- webpack的css压缩不兼容IOS8问题探索
webpack使用postcss的autoprefixer插件,并在压缩css时使用了cssnano,处理不当的情况下会导致压缩css后,部分兼容前缀(比如-webkit-)被删除的问题. postc ...
- TensorFlow图像处理API
TensorFlow提供了一些常用的图像处理接口,可以让我们方便的对图像数据进行操作,以下首先给出一段显示原始图片的代码,然后在此基础上,实践TensorFlow的不同API. 显示原始图片 impo ...
- cocos2d-x工作小记
1.当一个layer跳到下一个layer时,需要传递数据,可以默认定义一个setUserData()方法. 2.cocos2d-x不使用传统的值类型,所有的对象都创建在堆上,然后通过指针引用. 3.传 ...