数码资讯
避免数字计算精度误差的Javascript方法
如果我问你0.1 + 0.2等于多少你可以送我一个白眼,0.1 + 0.2=0.3。那还是个问题吗即使是幼儿园的孩子也会回答这样一个儿科医生的问题,但你知道,编程语言中同样的问题可能并不像它那么简单。 不相信吗让我们先看看JS的一部分。 VaR NUMA = 0.1; var = 0.2; 警报((
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
如果我问你0.1 + 0.2等于多少你可以送我一个白眼,0.1 + 0.2=0.3。那还是个问题吗即使是幼儿园的孩子也会回答这样一个儿科医生的问题,但你知道,编程语言中同样的问题可能并不像它那么简单。
不相信吗让我们先看看JS的一部分。
VaR NUMA = 0.1;
var = 0.2;
警报((NUMA +麻木)= 0.3);
执行结果是false,这是正确的。当我第一次看到这段代码时,我想当然地认为这是真的,但是实现的结果令我吃惊。这是我的方式开放了。没有no.let试试下面的代码看看为什么结果是错误的。
VaR NUMA = 0.1;
var = 0.2;
警报(NUMA +麻木);
原来,0.1 + 0.2 = 0.3000000000000000.is很精彩吗事实上,对于浮点数的四则运算,几乎所有的编程语言将类似于准确性的问题,但在语言的C++和C # / java已经封装好的方法避免问题的准确性,而Javascript是弱类型语言,设计不浮点严格的数据类型,所以准确性问题尤为突出。以下是这一误差的精度分析和如何修复错误。
首先,我们必须站在计算机的角度来考虑0.1 + 0.2这个似乎是小儿科医生的问题,我们知道计算机能读的是二进制,而不是小数,所以我们首先将0.1和0.2转换成二进制。
0.1 = 0.0001100110011001……(无限循环)
0.2 = 0.0011001100110011……(无限循环)
最多52个双精度浮点数的小数部分,所以两在一起之后因为一连串的0.0100110011001100110011001100110011001100110011001100浮点数字小限制截断二进制数,在这个时候,我们再把它转换为十进制,成为0.3000000000000000。
这就是问题所在,如何解决这个问题呢我想要的结果是0.1 + 0.2 = 0.3!!!
最简单的解决方案是给出清晰的精度要求。在返回值的过程中,计算机将自动获取四到五,例如:
VaR NUMA = 0.1;
var = 0.2;
警报(parseFloat((NUMA +麻木)。ToFixed(2))= = = 0.3);
但是很显然,如果有一种方法可以帮助我们解决浮点数的精度问题,这不是一个漫长而容易的方法:
math.formatfloat =函数(F,数字){
var m = math.pow(10位数);
返回parseInt(F M,10) /米;
}
VaR NUMA = 0.1;
var = 0.2;
警报(Math.formatFloat(NUMA +麻木= 0.3,1));
这个方法是什么意思为了避免精度差,我们把n个数的功率乘以需要计算10,转换成计算机可以准确地识别整数,然后用n的10的功率,大多数编程语言的精度相差很大,我们借用了一些浮点错误。
如果下次有人问你0.1 + 0.2等于几个,你必须小心!
不相信吗让我们先看看JS的一部分。
VaR NUMA = 0.1;
var = 0.2;
警报((NUMA +麻木)= 0.3);
执行结果是false,这是正确的。当我第一次看到这段代码时,我想当然地认为这是真的,但是实现的结果令我吃惊。这是我的方式开放了。没有no.let试试下面的代码看看为什么结果是错误的。
VaR NUMA = 0.1;
var = 0.2;
警报(NUMA +麻木);
原来,0.1 + 0.2 = 0.3000000000000000.is很精彩吗事实上,对于浮点数的四则运算,几乎所有的编程语言将类似于准确性的问题,但在语言的C++和C # / java已经封装好的方法避免问题的准确性,而Javascript是弱类型语言,设计不浮点严格的数据类型,所以准确性问题尤为突出。以下是这一误差的精度分析和如何修复错误。
首先,我们必须站在计算机的角度来考虑0.1 + 0.2这个似乎是小儿科医生的问题,我们知道计算机能读的是二进制,而不是小数,所以我们首先将0.1和0.2转换成二进制。
0.1 = 0.0001100110011001……(无限循环)
0.2 = 0.0011001100110011……(无限循环)
最多52个双精度浮点数的小数部分,所以两在一起之后因为一连串的0.0100110011001100110011001100110011001100110011001100浮点数字小限制截断二进制数,在这个时候,我们再把它转换为十进制,成为0.3000000000000000。
这就是问题所在,如何解决这个问题呢我想要的结果是0.1 + 0.2 = 0.3!!!
最简单的解决方案是给出清晰的精度要求。在返回值的过程中,计算机将自动获取四到五,例如:
VaR NUMA = 0.1;
var = 0.2;
警报(parseFloat((NUMA +麻木)。ToFixed(2))= = = 0.3);
但是很显然,如果有一种方法可以帮助我们解决浮点数的精度问题,这不是一个漫长而容易的方法:
math.formatfloat =函数(F,数字){
var m = math.pow(10位数);
返回parseInt(F M,10) /米;
}
VaR NUMA = 0.1;
var = 0.2;
警报(Math.formatFloat(NUMA +麻木= 0.3,1));
这个方法是什么意思为了避免精度差,我们把n个数的功率乘以需要计算10,转换成计算机可以准确地识别整数,然后用n的10的功率,大多数编程语言的精度相差很大,我们借用了一些浮点错误。
如果下次有人问你0.1 + 0.2等于几个,你必须小心!
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。