原文地址:http://eatpockyboy.blog.163.com/blog/static/116734640201231414154243/
最近做javascript算价格总和的时候遇到乘法也有乘不尽的情况。。。= =! 设想是js的运算算法里面包含了除法 没想到是这样的的 = =! js解释器的作者们真心强啊。。。 除了下文提及的解决方法之外 还有一个就是如果浮点的小数位确定时 比如价格是小数点后两位的 那么我们可以把价格乘以100 运算完之后再作相应的处理 这样会涉及一个位数过大(比如我这个价格要算个n次方的话就......)而转字符串处理的问题 这样效率本来就不高的算法而变得更加笨重 呃 但是下文的通过字符串切割分成小数部分和整数部分运算再算结果的这个方法效率貌似也不怎的 因此如何取舍就看诸君的需求了
转自:http://topic.csdn.net/u/20120329/17/6cc27133-a13f-4b9d-b253-fc8a04fd2f5c.html
-----------------正文-----------------
最近做js是对浮点类型计算时总是有偏差比如
3*0.8输出2.4000000000000003
在网上查了一下原因:
用解析字符串的方式移动小数点,转化为整数,完毕后,在把小数点复位。
浮点数运算的时候,先转化为二进制,用二进制来算,结果再转回十进制
例如 :求1038.1-1000
1038.1=10000001110.0001100110011001100110011001100110011001100.....
1000= 1111101000
1038.1转化为二进制是个无限循环小数,1100是循环节,只能取近似值,误差就是这里产生的
如果浏览器版本高,可以用toFixed() 方法可把 Number 四舍五入为指定小数位数的数字.
后有固定的 num 位数字。如果必要,该数字会被舍入,也可以用 0 补足,以便它达到指定的长度。如果 num 大于 le+21,则该方法只调用 NumberObject.toString(),返回采用指数计数法表示的字符串。
语法
NumberObject.toFixed(num)
返回值
返回 NumberObject 的字符串表示,不采用指数计数法,小数点后有固定的 num 位数字。如果必要,该数字会被舍入,也可以用 0 补足,以便它达到指定的长度。如果 num 大于 le+21,则该方法只调用 NumberObject.toString(),返回采用指数计数法表示的字符串。
抛出
当 num 太小或太大时抛出异常 RangeError。0 ~ 20 之间的值不会引发该异常。有些实现支持更大范围或更小范围内的值。
当调用该方法的对象不是 Number 时抛出 TypeError 异常。
在本例中,我们将把数字舍入为仅有一位小数的数字:
Show the number 13.37 with one decimal:
<script type="text/javascript">
var num = new Number(13.37);
document.write (num.toFixed(1))
</script>
输出:
Show the number 13.37 with one decimal:
13.4
解决方法:
function accMul(arg1,arg2) //将浮点类型转为整形操作完回归小数
{
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)
}
分享到:
相关推荐
此函数是我自己写的,虽然在网上可以搜到很多,不过我找到的都是在算法中存在基本的浮点数的运算,导致结果仍然是错误的。由于刚刚学写JS,所以可能考虑不够周全,望大家批评指正。 代码中加了四舍五入函数,是网上...
由于javascript的浮点运算是不精确的(对于大多数编程语言都是这样),此程序使用整数来代替浮点数进行运算,最后再转化为浮点数,可以实现对设置范围内(运算范围在程序中为自定义变量range)的浮点运算实现精度...
JavaScript 只有一种数字类型 Number ,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的。 浮点数的精度问题不是JavaScript特有的,因为有些小数以二进制表示位数是无穷的
浮点数的精度问题不是JavaScript特有的,因为有些小数以二进制表示位数是无穷的
js中浮点类型数据的计算 7.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位... 网上找到了一些解决办法,就是重新写了一些浮点运算的函数。 下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:
javascript做带小数的计算时,会出现9的循环,以下方法帮助解决。 第一个参数是需要处理的数值,第二个参数是需要保留的小数位数。自家项目里面就这么用了~ 代码如下: function round(v,e){ var t=1; for(;e>0;t*=10...
计算器 > 2.1 + 2.24.300000000000001> calc ( ' 2.1 + 2.2 ' )4.3用法使用NPM:npm install --save calculatorjs 在Node.js或浏览器中: const calc = require ( 'calculatorjs' )console . log ( calc ( ' 0.1*...
javascript小数精度丢失的完美解决方法.docx
JavaScript实现检验除法运算JavaScript实现检验除法运算JavaScript实现检验除法运算JavaScript实现检验除法运算JavaScript实现检验除法运算
第11节 JavaScript数组常用方法及应用.rar第11节 JavaScript数组常用方法及应用.rar第11节 JavaScript数组常用方法及应用.rar第11节 JavaScript数组常用方法及应用.rar第11节 JavaScript数组常用方法及应用.rar第11...
曾经项目用到过的,之前在网上找到此代码,但在特定条件下除法和加法运算依然会出现BUG个人对此稍作优化 代码如下://除法函数,用来得到精确的除法结果//说明:javascript的除法结果会有误差,在两个浮点数相除的...
常见的JavaScript内存泄露原因及解决方案.docx
javascript方法和技巧大全 javascript方法和技巧大全 javascript方法和技巧大全 javascript方法和技巧大全
Javascript 和大部分语言一样在浮点数运算时,经常出现精度丢失的问题,由于现在的大量Web项目经常涉及到货币计算或数学高级计算,此插件提供简单浮点运算,浮点存储格式符合IEEE754计算机
问题: 37.5*5.5=206.08 (JS算...解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数。 下面就把这些方法摘录下来,以供遇到同样问题的朋友参考: 程序代码 //除法函数,用来得到精确的除法结果 //
javascript float运算会有误差,可以用此脚本中的函数进行修补。
能解决各种javascript在各大浏览器中的不兼容问题,让不兼容的程序兼容各大浏览器