校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > js语言和框架 > 语法相关-操作符相关
题目

JS浮点数精度问题:当打印小数相加的时候会出现数据不准确的情况,试问原因及解决方案

解答

一、问题引入

console.log(0.1+0.1) //0.2
console.log(0.1+0.2) //0.30000000000000004(精度最高保留到17位)

因为像 0.1+0.2这样的操作对于计算机来说转换为二进制之后将是两个无限循环的数。

而对于计算机而言是不允许有无限的,进行四舍五入之后双精度浮点数保留52位

结果为0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100

转为十进制就是0.30000000000000004

二、基本解决方法

【1】利用toFixed(digits)
         toFixed函数在digits参数存在的情况下返回一个所给数值的定点数表示法的字符串(digits要在0-20之间,默认为0)。

         我们可以利用该函数限定返回数值的位数,从而达到提高精度的效果。

【2】重写toFixed函数
         思路为放大原有的数据,利用整数的整除来避免精度丢失

【3】基础运算自实现

C 6条回复 评论
٩(๑^o^๑)۶

在js底层中,,每个变量是以二进制表示,0.1和0.2转化为二进制的时候是无限循环小数,所以js就会进行截取,截取之后0.1和0.2就不是它们本身了,比原来大那么一点,所以0.1+0.2>0.3.

解决方法:先给他们放大倍数,随后除以相应倍数。

发表于 2022-07-16 18:09:58
0 0
WHmuse

所有的程序语言都无法计算精确么

发表于 2020-10-28 13:08:56
0 0
WHmuse

所有的程序语言都无法计算精确么

发表于 2020-10-28 13:08:55
0 0
Yates

弱类型语言,数据类型不严格,typescript然后就解决了这个问题啦

发表于 2020-10-28 10:19:38
0 0
天宫

原因:JS是弱类型语言,数据类型并不严格。
解决方案:按小数位数乘上相应的10的幂次方,提升为整数再相加,运算结束后再将小数降下

发表于 2020-10-28 10:15:08
0 0