首页 > 试题广场 >

下题的结果正确的是?varone=0.1vartwo=0.2

[单选题]
下题的结果正确的是?
var one   = 0.1
 var two   = 0.2
var six   = 0.6
var eight = 0.8
[two - one == one, eight - six == two] 
  • [true, true]
  • [false, false]
  • [true, false]
  • other
0.2-0.1=0.1的原因是0.2是0.1的2倍,二进制乘2或者除2,左移或又移一位就行,所以0.2-0.1=0.1,但是0.8不是0.6的倍数,所以0.8-0.6!=0.2。
发表于 2021-07-02 14:21:20 回复(0)
JS不能很精确地表示小数。当两个浮点数相加或者相减,将有可能会导致精度丢失问题。

JS中的小数采用的是双精度(64位)表示的,由三部分组成:符 + 阶码 + 尾数,在十进制中的 1/10,在十进制中可以简单写为 0.1 ,但在二进制中,他得写成:0.0001100110011001100110011001100110011001100110011001……(后面全是 1001 循环)。因为浮点数只有52位有效数字,从第53位开始,就舍入了。这样就造成了“浮点数精度损失”问题。

通过上面分析,我们知道JS利用二进制存储的,所有的小数都可以用a0*(1/2)+a1*(1/4)+a2*(1/8)+…表示,这里(a0,a1,a2…只能取值0或者1),根据这个表达式我们发现0.1,0.2,0.6和0.8都是无限循环小数,但是0.2-0.1=0.1的原因是0.2是0.1的2倍,二进制乘2或者除2,左移或又移一位就行,所以0.2-0.1=0.1,但是0.8不是0.6的倍数,所以0.8-0.6!=0.2。
原文链接:https://blog.csdn.net/weixin_43465339/article/details/108182482
发表于 2021-09-15 21:42:23 回复(0)
补充:要想后者为true (0.8-0.6).toFixed(1)
发表于 2021-07-31 12:45:28 回复(0)
等一个详细解答,js的浮点精度都知道有问题,实际上一般也都用tofix或者误差判断,但到底对于十进制运算哪些会丢失哪些不会真的就很难搞清楚,除非你自己算它二进制表示
我自己反正f12做了个穷举,对于浮点数
乘法是没有丢失的
除法是玄学。没看出规律
加法是玄学。没看出规律
减法两数比为2或1/2确实不丢失,但其他情况也是玄学。没看出规律
拿有答案说的0.2-0.1是倍数说吧,0.9-0.2=0.7,这个也没有精度丢失,但不是倍数。如果我不直接用js算不知道怎么判断是否丢失呢?

发表于 2023-08-23 09:19:30 回复(0)