`
flex_莫冲
  • 浏览: 1095305 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

javascript浮点运算偏差的成因及解决方法

 
阅读更多
原文地址: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) 
}
分享到:
评论

相关推荐

    JavaScript 浮点 运算 函数

    此函数是我自己写的,虽然在网上可以搜到很多,不过我找到的都是在算法中存在基本的浮点数的运算,导致结果仍然是错误的。由于刚刚学写JS,所以可能考虑不够周全,望大家批评指正。 代码中加了四舍五入函数,是网上...

    Javascript 浮点运算的问题分析与解决方法

    JavaScript中的浮点运算问题主要源于数字类型(Number)的表示方式,这是由IEEE-754标准决定的。在计算机科学中,浮点数并非总是精确的,尤其是当它们以二进制形式存储时。例如,十进制的小数0.1、0.2或0.3在二进制下...

    使用Vue.js及Element编写的精度浮点运算计算器源码(打开运行)

    由于javascript的浮点运算是不精确的(对于大多数编程语言都是这样),此程序使用整数来代替浮点数进行运算,最后再转化为浮点数,可以实现对设置范围内(运算范围在程序中为自定义变量range)的浮点运算实现精度...

    Javascript 浮点运算精度问题分析与解决

    ### Javascript 浮点运算精度问题分析与解决 #### 知识点一:浮点数精度问题的普遍性 首先需要明确的是,浮点运算精度问题并不仅仅存在于JavaScript中,这实际上是计算机科学中的一个普遍问题。原因在于计算机使用...

    js中浮点型运算BUG的解决方法说明.docx

    本文将详细介绍如何解决JavaScript中的浮点型运算BUG,并提供一些实用的函数来实现更精确的计算。 首先,我们要理解JavaScript中的浮点数运算误差。在计算机内部,浮点数是以二进制形式存储的,但不是所有十进制...

    js中浮点型运算BUG的解决方法说明

    总结来说,这些函数通过以下步骤解决了JavaScript中浮点运算的精度问题: 1. 分析输入数值的小数部分位数。 2. 如果需要,调整数值的位数,使其具有相同的精度。 3. 使用整数运算代替浮点数运算,以避免浮点数误差...

    js中浮点类型数据的计算

    js中浮点类型数据的计算 7.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位... 网上找到了一些解决办法,就是重新写了一些浮点运算的函数。  下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:

    JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法

    javascript做带小数的计算时,会出现9的循环,以下方法帮助解决。 第一个参数是需要处理的数值,第二个参数是需要保留的小数位数。自家项目里面就这么用了~ 代码如下: function round(v,e){ var t=1; for(;e&gt;0;t*=10...

    修复网页javascript方法及代码

    通过上述几种方法,可以有效地解决IE浏览器中JavaScript被禁用或兼容性问题。对于Web开发者来说,了解并掌握这些技巧是非常重要的,因为它们可以帮助确保网站在各种浏览器环境下的正常运行,从而为用户提供更好的...

    javascript避免数字计算精度误差的方法详解.docx

    本文将深入探讨这一现象的原因,并提供几种有效的解决方法。 #### 二、原因分析 要理解为什么会出现这种精度误差,我们需要了解计算机内部如何表示浮点数。计算机通常使用IEEE 754标准来存储和计算浮点数。在该标准...

    IE8的JavaScript点击事件(onclick)不兼容的解决方法

    IE8不支持`setAttribute`方法来设置事件处理器是产生兼容性问题的核心原因。在标准模式下,IE8及以下版本不支持通过`setAttribute`直接为元素添加事件监听器,这与现代浏览器如Chrome和Firefox存在差异。为了确保...

    js中Number数字数值运算后值不对的解决方法.docx

    另一种方法是扩展JavaScript的Number对象,通过在其 prototype 上添加自定义方法来实现精确的浮点运算。这样,可以直接使用扩展后的Number对象方法来完成加、减、乘、除运算,而不需要额外调用自定义函数。以下是...

    IE不能运行JavaScript的解决方法

    以下是一些解决IE不能运行JavaScript的方法: 1. **启用JavaScript**:首先检查IE浏览器的设置,确保JavaScript是开启状态。打开“工具”菜单(或按`Alt+X`),选择“Internet选项”,然后转到“安全”选项卡。点击...

    javascript脚本病毒的编写与防范方法研究.doc

    JavaScript脚本病毒的编写与防范方法研究 JavaScript脚本病毒是指使用JavaScript语言编写的恶意程序,能够感染和破坏计算机系统的安全。JavaScript脚本病毒的编写与防范方法研究是信息安全领域中的重要课题,本文将...

    解决JS浮点数(小数)计算加减乘除的BUG

    在JavaScript中,浮点数(小数)的计算可能会出现一些看似奇怪的结果,这主要是由于计算机内部表示浮点数的方式导致的。这个问题是许多开发者在编写JavaScript代码时可能遇到的一个常见陷阱。本文将深入探讨这个问题...

    javascript解决URL传值时乱码的方法.doc

    javascript解决URL传值时乱码的方法.doc

Global site tag (gtag.js) - Google Analytics