javascript中做减法时,出现小数位增加

问题描述

javascript 中为何在做减法时,结果中的小数位会增加许多。比如 :351778.8-206233.77 =145545.02999999997

解决方案

这个bug是js固有的,浮点数精度不准,你可以用下面方法来解决,思路是先放大,求和、差、积等运算后再缩小。如://加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 //调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果 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}//给Number类型增加一个add方法,调用起来更加方便。 Number.prototype.add = function(arg) { return accAdd(arg, this);}//减法函数,用来得到精确的减法结果//说明:javascript的减法结果会有误差,在两个浮点数相减的时候会比较明显。这个函数返回较为精确的加法结果。//调用:accSub(arg1,arg2) //返回值:arg1减去arg2的精确结果function accSub(arg1, arg2) { 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);}//给Number类型增加一个add方法,调用起来更加方便。Number.prototype.sub = function(arg) { return accSub(arg, this);}
解决方案二:
楼主可以参考这个:http://my.oschina.net/u/658145/blog/103751
解决方案三:
顶楼上,学习了解浮点数,再决定如何使用它,我建议在计算过程中不出现小数,非数值计算,日常的系统基本上可以不出现小数。
解决方案四:
toFixed(num),num为你所需要的精度,会自动四舍五入。
解决方案五:
你可以使用toFixed(n)进行四舍五入var result = 351778.8-206233.77result = result.toFixed(2);
解决方案六:
google "浮点数 圆整误差 IEEE754"

时间: 2024-08-03 09:58:12

javascript中做减法时,出现小数位增加的相关文章

事务-数据库中做减法会对数据库造成很大压力吗?

问题描述 数据库中做减法会对数据库造成很大压力吗? 这样比如买一本书同时会有很多人买,在控制书的数量的时候我的想法, 每次有人买书的时候数据库进行这样的一个减法操作 booknum = booknum-1 然后在购买事务提交之前 我在代码中进行一个判断就是booknum是否大于0如果不是则回滚返回购买失败反之就执行成功 这种方法会比用时间戳比较带来的压力更大吗? 时间戳就是 在表中再加一个列用时间戳来表示 当你差booknum的时候把时间戳带上 update的时候把这个时间戳和数据库的比较 如果

浅谈JavaScript中定义变量时有无var声明的区别_javascript技巧

前段时间回答了一个关于定义变量时使用关键字var与否的区别,总结回顾一下. 1.在函数作用域内 加var定义的变量是局部变量,不加var定义的就成了全局变量. 使用var定义: var a = 'hello World'; function bb(){ var a = 'hello Bill'; console.log(a); } bb() //'hello Bill' console.log(a); //'hello world' 不使用var定义: var a = 'hello World'

javascript中function调用时的参数检测常用办法

1.方法重载 js中并不直接支持类似c#的方法重载,所以只能变相的来解决,示意代码:(利用了内置属性arguments) var f1 = function(p1,p2,p3){ switch(arguments.length){ case 0: alert("无参版本的f1") break; case 1: alert("1个参数版本的f1:" + p1) break; case 2: alert("2个参数版本的f1:" + p1 + &qu

javascript中方便增删改cookie的一个类_javascript技巧

主要是通过对document.cookie字符串的分析来进行功能的组装的. 温习一下javascript中对cookie的操作: 增加cookie可以用document.cookie="userId=111";来实现 完整版可以用:document.cookie="userId=111;domain=.google.com;path=\;secure=secure;expire="+date.toGMTString(); 可以设置cookie的过期时间,域名,路径

《JavaScript启示录》——1.11 原始值(String、Number、Boolean)在被用做对象时就像对象

1.11 原始值(String.Number.Boolean)在被用做对象时就像对象 原始值被当作构造函数创建的一个对象来使用时,JavaScript会将其转换为一个对象,以便可以使用对象的特性(如方法),而后抛弃对象性质,并将它变回到原始值.下面的代码采用了原始值,并展示了将值作为对象使用时会发生什么事情. <!DOCTYPE html><html lang="en"><body><script> // 生成原始值 var myNull

javascript中怎么做对象的类型判断_基础知识

最近在翻看John Resig的大作<Pro JavaScript Techniques>,里面讲到了如何做javascript的类型判断的问题.文中介绍了两种方式,一种是使用typeof,另一种是使用constructor.略感遗憾的是作为jquery的作者,他尽然没有介绍jquery使用的类型判断方式.不过没有关系,我在这里给大家一起总结下. 在这里我首先像大家推荐一个很好用的在线编辑器:http://jsfiddle.net/.他提供了jquery.mootools.prototype和

王中磊“抱怨”徐克想法多团队每天做减法(图)

我们年初给华谊电影部门做的是十个亿票房的年度指标,到<唐山大地震>的时候已经完成9亿了 独家投资1.3亿拍一部古装片,"当时我还是觉得压力挺大的."华谊兄弟传媒公司总裁王中磊向<南都周刊>表示. 这是一个大胆的计划.古装片已有类型化趋势,往往被诟病形式大于内容,观众审美疲劳,市场低迷."必须是非常棒的电影,才有可能收回成本." 他对<狄仁杰之通天帝国>的设想,是好本子.好导演.好演员.剧本由监制陈国富十年磨一剑打造,导演请的是天马

Javascript中使用exec进行正则表达式全局匹配时的注意事项_正则表达式

本文就是介绍在使用 Javascript 中使用 exec 进行正则表达式全局匹配时的注意事项. 先看一下常见的用法: 复制代码 代码如下: <script type="text/javascript"> var pattern = /http:\/\/([^\/\s]+)/; alert(pattern.exec('http://www.codebit.cn')); // http://www.codebit.cn,www.codebit.cn alert(pattern

JavaScript中关于for循环删除数组元素内容时出现的问题_javascript技巧

昨天用for循环进行数组去重的时候出现的问题, 首先,用双重for循环把前一个和所有后面的元素进行比较,如果相等则删除. 但是,如果数组里面有三个以上连续相等的元素的时候,就会出现问题. var arr = [1,1,1,2,2]; for(var i=0; i<arr.length-1; i++){ for(var j=i+1; j<arr.length; j++){ if(arr[i] === arr[j]){ arr.splice(j,1); } } } document.write(&