浮点型数据运算精度bug
/**
* 校验是否为数字
* @param arg
* @return
*/
function checkIsNumber(arg){
if(arg != null && arg.toString() != ""){
var re = /^-?(0|[1-9]+\d*|[1-9]+\d*\.\d+|0\.\d+)$/;
if(re.test(arg.toString())){
return true;
}
}
return false;
} /**
* 加法函数,用来得到精确的加法结果
* 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
* 返回值注意:arg1和arg2可能是整数、浮点数、null、空字符串、其他字符串
* @param arg1
* @param arg2
* @return
*/
function accAdd(arg1,arg2){
if(!checkIsNumber(arg1) || !checkIsNumber(arg2)){
return null;
}
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;
} // 给Number类型增加一个add方法,调用起来更加方便。
Number.prototype.add = function (arg){
return accAdd(this,arg);
} /**
* 减法函数,用来得到精确的减法结果
* 说明:javascript的减法结果会有误差,在两个浮点数相减的时候会比较明显。这个函数返回较为精确的减法结果。
* 返回值:arg1-arg2的值,arg1和arg2可能是整数、浮点数、null、空字符串、其他字符串
* @param arg1
* @param arg2
* @return
*/
function accSub(arg1,arg2){
if(!checkIsNumber(arg1) || !checkIsNumber(arg2)){
return null;
}
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);
return (arg1*m-arg2*m)/m;
} // 给Number类型增加一个subduct方法,调用起来更加方便。
Number.prototype.subduct = function (arg){
return accSub(this,arg);
} /**
* 除法函数,用来得到精确的除法结果
* 说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
* 返回值:arg1除以arg2的精确结果
* @param arg1
* @param arg2
* @return
*/
function accDiv(arg1,arg2){
if(!checkIsNumber(arg1) || !checkIsNumber(arg2)){
return null;
}
var t1,t2,r1,r2;
try{t1=arg1.toString().split(".")[1].length;}catch(e){t1=0;}
try{t2=arg2.toString().split(".")[1].length;}catch(e){t2=0;}
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);
} /**
* 乘法函数,用来得到精确的乘法结果
* 说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
* 返回值:arg1乘以arg2的精确结果
* @param arg1
* @param arg2
* @return
*/
function accMul(arg1,arg2) {
if(!checkIsNumber(arg1) || !checkIsNumber(arg2)){
return null;
}
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);
} // 给Number类型增加一个mul方法,调用起来更加方便。
Number.prototype.mul = function (arg){
return accMul(this,arg);
} console.log(accAdd(0.3,0.2)+" "+accSub(0.3,0.2))
浮点型数据运算精度bug的更多相关文章
- JS 浮点型数字运算(转)
示例: var num1=3.3; var num2=7.17; var ret=parseFloat(num1)+parseFloat(num2); //ret的值为:10.469999999999 ...
- 14、Java中用浮点型数据Float和Double进行精确计算时的精度问题
一.浮点计算中发生精度丢失 大概很多有编程经验的朋友都对这个问题不陌生了:无论你使用的是什么编程语言,在使用浮点型数据进行精确计算时,你都有可能遇到计算结果出错的情况.来看下面的例子. // 这是一个 ...
- C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算
运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateE ...
- Double数据运算过程中精度调整
Double数据进行运算时,容易出现多位小数的精度问题 ①问题现象 ②解决方案 使用BigDecimal类型来进行Double类型数据运算 创建BigDecimal类型对象时将Double类型的数据转 ...
- Java中浮点型数据Float和Double进行精确计算的问题
Java中浮点型数据Float和Double进行精确计算的问题 来源 https://www.cnblogs.com/banxian/p/3781130.html 一.浮点计算中发生精度丢失 ...
- double转换为int以及浮点型相加损失精度问题
最近在做支付相关模块的业务,数据库字段却使用的是double类型,其实也行,只要计算不在sql语句中进行,也是没有问题的. 预先的类属性设置的是Double类型,自己算的时候发现小数相加会出现损失精度 ...
- 搞懂js中小数运算精度问题原因及解决办法
js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言中的double类型(双精度浮点型),不区分浮点型和整数型. number类 ...
- pyhton学习笔记(基础五:数据类型、数据运算)
数据类型初识 1. 数字 整数:2是一个整数的例子 长整数 不过是大一些的整数 3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3*10-4. (-5+4j ...
- python基础2(数据类型、数据运算、for循环、while循环、列表)
1.数据类型 python使用对象模型来存储数据,每一个数据类型都有一个内置的类,每新建一个数据,实际就是一个对象,即所有数据都是对象. 对象的3个特性: 身份:即内存地址,可以用id()来获取 类型 ...
随机推荐
- ACM集训的1B。。。。黑色星期五。。。。2333333
题目: 印象中有好多个13号是星期五,13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的一个周期,要求计算1900年1月1日至1900 ...
- 如何理解C#委托
一:从下面的例子开始,理解委托变量本质 如上图,Condition是我定义的委托变量.这个委托变量的本质就是地址变量(即C语言当中的指针变量),它保存的是方法的入口地址. 当函数的调用者传递实参给这个 ...
- 第三篇:白话tornado源码之请求来了
上一篇<白话tornado源码之待请求阶段>中介绍了tornado框架在客户端请求之前所做的准备(下图1.2部分),本质上就是创建了一个socket服务端,并进行了IP和端口的绑定,但是未 ...
- I’m Sure It Will Only Take You A Few Days To Code
from:http://danshipper.com/non-technical-people-cant-estimate-developmen “So the site’s pretty simpl ...
- C# EasyUI树形结构权限管理模块
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本节和大家探讨下C#使用EasyUI树形结构/Tree构 ...
- DS-5建工程
DS-5教程-使用ARM DS-5 和DSTREAM仿真器调试裸机程序 http://bbs.elecfans.com/jishu_453909_1_1.html i2c( 楼主 )2014-10-1 ...
- understanding-论文
understanding temporal and spatial travel paterns of individual passengers by mining smart card data ...
- sql server 数据库 日期格式转换
日期时间转字符串:Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), ...
- GZIP压缩优化
使用gzip优化web应用(filter实现) 相关知识: gzip是http协议中使用的一种加密算法,客户端向web服务器端发出了请求后,通常情况下服务器端会将页面文件和其他资源,返回到客户端,客户 ...
- 与资源库同步时,我的svn报错 Previous operation has not finished; run 'cleanup' if it was interrupted
解决办法:选择你的项目,右键,小组(Team),刷新或清理(Refresh or Clean)即可.