/**
* 校验是否为数字
* @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的更多相关文章

  1. JS 浮点型数字运算(转)

    示例: var num1=3.3; var num2=7.17; var ret=parseFloat(num1)+parseFloat(num2); //ret的值为:10.469999999999 ...

  2. 14、Java中用浮点型数据Float和Double进行精确计算时的精度问题

    一.浮点计算中发生精度丢失 大概很多有编程经验的朋友都对这个问题不陌生了:无论你使用的是什么编程语言,在使用浮点型数据进行精确计算时,你都有可能遇到计算结果出错的情况.来看下面的例子. // 这是一个 ...

  3. C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算

     运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateE ...

  4. Double数据运算过程中精度调整

    Double数据进行运算时,容易出现多位小数的精度问题 ①问题现象 ②解决方案 使用BigDecimal类型来进行Double类型数据运算 创建BigDecimal类型对象时将Double类型的数据转 ...

  5. Java中浮点型数据Float和Double进行精确计算的问题

    Java中浮点型数据Float和Double进行精确计算的问题 来源  https://www.cnblogs.com/banxian/p/3781130.html 一.浮点计算中发生精度丢失     ...

  6. double转换为int以及浮点型相加损失精度问题

    最近在做支付相关模块的业务,数据库字段却使用的是double类型,其实也行,只要计算不在sql语句中进行,也是没有问题的. 预先的类属性设置的是Double类型,自己算的时候发现小数相加会出现损失精度 ...

  7. 搞懂js中小数运算精度问题原因及解决办法

    js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言中的double类型(双精度浮点型),不区分浮点型和整数型. number类 ...

  8. pyhton学习笔记(基础五:数据类型、数据运算)

    数据类型初识 1. 数字 整数:2是一个整数的例子 长整数 不过是大一些的整数 3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3*10-4. (-5+4j ...

  9. python基础2(数据类型、数据运算、for循环、while循环、列表)

    1.数据类型 python使用对象模型来存储数据,每一个数据类型都有一个内置的类,每新建一个数据,实际就是一个对象,即所有数据都是对象. 对象的3个特性: 身份:即内存地址,可以用id()来获取 类型 ...

随机推荐

  1. C# 程序实现功能目录

    1.根据年月日获取 星期几  http://www.cnblogs.com/liwp/p/5943226.html 2.json对象转换为泛型集合 http://www.cnblogs.com/liw ...

  2. ThinPHP命名空间,连接数据库是要修改的配置文件,Model数据模型层,跨控制器调用,如何获取系统常量信息,

    一.命名空间(主要是为了实现自动加载类) *命名空间(相当于虚拟的目录),为了让类有一个统一的文件夹来管理(可以自动加载'类'),每个文件都要有命名空间*tp如何做命名空间:*TP框架下有一个初始命名 ...

  3. Scala的模式匹配

    1.概述 2.程序示例(普通的示例) 3.模式匹配(Array) 4.程序示例(Array) 5.模式匹配(List) 6.程序示例 7.遍历 8.模式匹配(case class) 9.程序示例(传统 ...

  4. 编写bat(批处理文件)的优势

    以前编写java小程序打成jar包运行的时候非常麻烦,在dos环境先cd进入那个文件夹,再运行java -jar *.jar,自从看了bat以后,发现.bat真的是dos下面运行的好帮手. @echo ...

  5. mysql和CSV

    1.mysql导入和导出数据可以通过mysql命令或者mysqldump来完成.mysqldump可以导入和导出完整的表结构和数据.mysql命令可以导入和导出csv文件. 1.mysql支持导入和导 ...

  6. iOS开发路线简述

    1 iOS开发环境1.1 开发环境标准的配置是MacOSX+Xcode.MacOSX的话首选用苹果电脑,Macmini最便宜只要4000多就好了然后自己配一个显示器,MacBookPro 也可以,不推 ...

  7. git 添加 文件到GitHub

    用pycharm写代码,暂时不太了解它的版本控制方式,使用git托管到 GitHub. 1. 在被提交的文件夹下,运行 git  init,初始化git; 2. 添加需要提交的文件, git add ...

  8. html 以及JavaScript 转义

    1.之前遇到一个问题,在用js给某个控件赋值时如果含有单引号'或者双引号"有可能导致赋值不成功,如document.getElementById("txtTestBox1" ...

  9. TensorFlow安装(Ubuntu 16.04)

    原文链接 github not support on this platform pip安装: # Ubuntu/Linux 64-bit $ sudo apt-get install python- ...

  10. 一些有意思的VR设备介绍

    1.计算机(Computers) 不久以前,一个VR系统需要百万美元的超级计算机:而如今顶级的VR系统正在使用桌面便携式计算机簇,极大的降低了价格和维护成本. 2.跟踪器(Tracking) 为了能与 ...