javascript中float类型计算的精确度问题
2016-09-07 19:15
288 查看
在平时的使用过程中,发现使用float类型在进行计算的时候,有些数字在进行计算后,小数点后面的位数明显变多,并且最后一位不为零,和正常的计算结果产生了误差。首先看一下我的代码。
找到一段解释如下,但是个人觉得解释的不是很好。
(非原创)在JavsScript中,变量在存储时并不区分number和float类型,而是统一按float存储。而javascript使用IEEE 754-2008 标准定义的64bit浮点格式存储number,按照IEEE 754的定义:decimal64对应的整形部分长度为10,小数部分长度为16,所以默认的计算结果为“7.0000000000000001”,如最后一个小数为0,则取1作为有效数字标志。
解决方法:1、在计算结果后限制小数点后的位数,以我的代码为例。
2、重写浮点计算的函数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>求和</title> </head> <body> <input type="text" id="add1" value="" /> <input type="text" id="add2" value="" /> <input type="button" id="add3" value="add" onclick="add()"/> <script type="text/javascript"> function add(){ var a1 = document.getElementById('add1').value; var a2 = document.getElementById('add2').value; if(isNaN(a1)||isNaN(a2)){ alert('非法的数据类型')//非法数据类型报错 } else{ var num = parseFloat(a1)+parseFloat(a2);//相加 alert(num); //弹出结果 } } </script> </body> </html>运行代码可以发现,有一部分数字的计算是没有问题的,但是当我输入1.1和2.2然后相加的时候发现结果变成了3.30000000003(不知道几个0,随便写了几个)。然后我发现问题后在百度搜索答案。
找到一段解释如下,但是个人觉得解释的不是很好。
(非原创)在JavsScript中,变量在存储时并不区分number和float类型,而是统一按float存储。而javascript使用IEEE 754-2008 标准定义的64bit浮点格式存储number,按照IEEE 754的定义:decimal64对应的整形部分长度为10,小数部分长度为16,所以默认的计算结果为“7.0000000000000001”,如最后一个小数为0,则取1作为有效数字标志。
解决方法:1、在计算结果后限制小数点后的位数,以我的代码为例。
var num = (parseFloat(a1)+parseFloat(a2)).toFixed(5);//保留小数点后五位
2、重写浮点计算的函数
//加法函数,用来得到精确的加法结果 //说明: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 }
相关文章推荐
- javascript中float类型计算的精确度问题
- C#计算float类型数据求和不精确问题
- double float 类型的数据(小数)在作计算的时候,需要注意的。(Java和JavaScript)都有这问题
- 奇怪的js问题(JavaScript浮点运算的问题) float类型相乘的有时候 会出现错误!! 注意!!!
- float类型进行计算精度丢失的问题
- JavaScript中float的减法与乘法计算错误问题
- java中double、float类型计算精度丢失问题
- 解决两个float类型的数值相减,精确度不准确的问题
- java float 类型存储到 sqlserver 的numeric 类型中,出现计算溢出的问题
- JavaScriptSerializer 对 DateTime 数据类型的JSON序列化的问题
- Java中float类型精度问题
- 关于float类型比较的问题
- java float 类型存储到 sqlserver 的numeric 类型中,出现计算溢出的问题
- JavaScriptSerializer 对 DateTime 数据类型的JSON序列化的问题
- oracle 的float(b)精确度计算方法
- 表达式计算过程中的类型转换,经常被忽略的问题
- js中float类型加减乘除运算精度问题
- C# string类型转换为float精度问题
- JavaScript类型转换方法及需要注意的问题
- JavaScriptSerializer 对 DateTime 数据类型的JSON序列化的问题