在 JavaScript 中整数和浮点数都属于number 数据类型,所有数字都是使用64位浮点数形式储存,遵循IEEE-754双精度标准存储,即便整数也是如此。 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 1.00。而有时候用浮点数进行数学运算的时候,发现居然会有一些误差,比如:
<script type="text/javascript">
console.log("加法:");
console.log("0.1 + 0.2 = " + (0.1 + 0.2));
console.log("0.7 + 0.1 = " + (0.7 + 0.1));
console.log("0.2 + 0.4 = " + (0.2 + 0.4));
console.log("减法:");
console.log("0.3 - 0.2 = " + (0.3 - 0.2));
console.log("乘法:");
console.log("19.9 * 100 = " + (19.9 * 100));
console.log("9.7 * 100 = " + (9.7 * 100));
console.log("除法:");
console.log("0.3 / 0.1 = " + (0.3 / 0.1));
console.log("0.69 / 10 = " + (0.69 / 10));
</script>
结果为:
JavaScript 里的数字是采用 IEEE 754 标准 的 64 位双精度浮点数。该规范定义了浮点数的格式,对于64位的浮点数在内存中的表示,最高的1位是符号位,接着的11位是指数,剩下的52位为有效数字,具体:
其中:
符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度。 IEEE 754规定,有效数字第一位默认总是1,不保存在64位浮点数之中。也就是说,有效数字总是1.xx…xx的形式,其中xx..xx的部分保存在64位浮点数之中,最长可能为52位。因此,JavaScript提供的有效数字最长为53个二进制位(64位浮点的后52位+有效数字第一位的1)。
那么举个例子:
计算 0.1 + 0.2 时,内存中发生的事:
首先,十进制的 0.1 和 0.2 都会被转换成二进制,但由于浮点数用二进制表达时是无穷的,即
IEEE 754 标准的 64 位双精度浮点数的小数部分最多支持 53 位二进制位,所以两者相加之后得到二进制为:
因浮点数小数位的限制而截断的二进制数字,再转换为十进制,就成了 0.30000000000000004。所以在进行算术计算时会产生误差。
一般使用 toFixed() 方法 ,语法为:
数值.toFixed(num);
num 是精确的位数,例如:
var num = 13.14520;
console.log(num.toFixed(2));
结果为: 13.14
理解javascript中浮点数计算不精准的原因,如何解决浮点数的四则运算(加减乘除)。js中除了toFixed方法以外的实现方法总汇
项目中用到浮点数,Int 等 js中 Number类型比较多, 加上牵涉到财务软件, 前台js运算等。 有时候会出现精确度的问题 , 公共方法中有好事者写的方法。 此处拿来借鉴。
JavaScript能表示并进行精确算术运算的整数范围为:正负2的53次方,也即从最小值-9007199254740992到最大值+9007199254740992之间的范围;对于超过这个范围的整数,JavaScript依旧可以进行运算,但却不保证运算结果的精度。
今天在看基础js文章的时候发现了一个浮点数的精度问题,当打印小数相加的时候有时候会出现数值不准确的情况,如果是在做一些需要数据精度要求较高的工作的时候稍有不慎就会出现问题
JS能够正确表示的整数,JS里面尽管能够正确表示的数值量在2^53,但是位运算能够正常运算的范围却依然是32位,第一位为符号位,所以是2^31,转成10位的边界值是(2147483648)。
实现简单,便于做加减乘除使用,由于项目临时要用记录下,如需要更加复杂的计算类库,可以考虑 math.js等知名类库;代码,使用方法如下
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!