文档章节

javascript中float类型计算的精确度问题

zfx2016
 zfx2016
发布于 2016/10/19 11:42
字数 552
阅读 7
收藏 0

在平时的使用过程中,发现使用float类型在进行计算的时候,有些数字在进行计算后,小数点后面的位数明显变多,并且最后一位不为零,和正常的计算结果产生了误差。首先看一下我的代码。

<!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
}







© 著作权归作者所有

zfx2016
粉丝 1
博文 22
码字总数 14027
作品 0
广州
前端工程师
私信 提问
全面总结 JS 中浮点数运算问题

经常会碰到一个问题,"为什么 ? ",我找了很多资料,尽可能全面地分析原因和解决办法。 文章可能有点枯燥,囧。 这里先给出判断方法 IEEE 754 64 位浮点类型 IEEE 754 IEEE 754 规定了四种表...

云影sky
昨天
0
0
Javascript浮点数运算及比较代码收集整理

以下代码转自:http://segmentfault.com/a/1190000000324193 浮点数加法: /** ** 加法函数,用来得到精确的加法结果 ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较...

Jacky.Wang
2015/10/29
346
0
浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

在知乎上上看到如下问题: 浮点数精度问题的前世今生? 1.该问题出现的原因 ? 2.为何其他编程语言,比如java中可能没有js那么明显 3.大家在项目中踩过浮点数精度的坑? 4.最后采用哪些方案规...

zhoulujun
05/17
30
0
JavaScript 中的表示任意精度的 BigInt

作为前端开发,不知道大家是否被大整数困扰过?JavaScript 对大整型一直没有支持,想要操作大整型数字必须借助第三方库,除了麻烦还可能有打包过大和运行时效率的问题。对比 Java 中,早就有...

HyG
03/13
0
0
Firefox和IE之间7个JavaScript的差异

尽管 JavaScript 历史上使用冗长而令人生厌的代码块来标的特定浏览器的时期已经结束了,但是偶尔使用一些简单的代码块和对象检测来确保一些代码在用户机器上正常工作依然是必要的。 这篇文章...

asurann
2010/01/26
101
0

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
44分钟前
4
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
40
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部