alert(0.2+0.1);//0.30000000000000004alert(0.2+0.3);//0.5alert(0.05+0.25)//0.3为什么都是小数运算,有的有精度舍入有的没有????
认证高级PHP讲师
在这些表达式中,只有0.25是能够用二进制精确表示的,其他的对二进制来说都是无限循环小数。
0.25
那为什么有些有舍入有些没有呢?
其实都是有舍入的,因为是无限循环小数嘛!但是计算机是有最大精度的,也就是对这些无限小数,它会保留XX位,而有些时候恰巧这个精度的近似值与精确值是相同的。
保留XX位
以10进制举例。对于1/3+2/3,它们每一个都是无限小数,但是假如我要在有限精度内用小数来计算,例如精度为5位吧,就是:
1/3+2/3
0.33333 + 0.66667
结果是多少呢,正好是1!!我们由不精确的值得到了精确的结果!
1
而对于1/3+1/3就没有这么幸运了,还是假设精度为5位:
1/3+1/3
0.33333 + 0.33333
结果为0.66666,这个结果甚至都不是2/3的近似值0.66667。所以这种情况下我们由不精确的值得到的是同样不精确的结果。其实这种情况更为普遍。
0.66666
2/3
0.66667
其实这种情况更为普遍
按照惯例,下面是总结时间了。
在计算机中使用浮点数进行计算时,一定要考虑好精度,同时一定不要企图获得100%精确的结果,而应该始终把结果当成近似值来处理。把握好这两个原则,就能写出更健壮的代码。
在这些表达式中,只有
0.25
是能够用二进制精确表示的,其他的对二进制来说都是无限循环小数。那为什么有些有舍入有些没有呢?
其实都是有舍入的,因为是无限循环小数嘛!但是计算机是有最大精度的,也就是对这些无限小数,它会
保留XX位
,而有些时候恰巧这个精度的近似值与精确值是相同的。以10进制举例。对于
1/3+2/3
,它们每一个都是无限小数,但是假如我要在有限精度内用小数来计算,例如精度为5位吧,就是:0.33333 + 0.66667
结果是多少呢,正好是
1
!!我们由不精确的值得到了精确的结果!而对于
1/3+1/3
就没有这么幸运了,还是假设精度为5位:0.33333 + 0.33333
结果为
0.66666
,这个结果甚至都不是2/3
的近似值0.66667
。所以这种情况下我们由不精确的值得到的是同样不精确的结果。其实这种情况更为普遍
。按照惯例,下面是总结时间了。
在计算机中使用浮点数进行计算时,一定要考虑好精度,同时一定不要企图获得100%精确的结果,而应该始终把结果当成近似值来处理。把握好这两个原则,就能写出更健壮的代码。