求floor(60 * (0.15/3)结果为2的原理。。

opso 发布于 2015/10/26 11:36
阅读 464
收藏 1
PHP

floor(60 * (0.15/3)运算结果。。让我很困扰。。

能分析下原理么。。

加载中
2
木兰宿莽
木兰宿莽
话说你少加了个括号,这里涉及到浮点数在内存中的存储及其运算,0.15二进制表示为0.0010011001100110,这里是保留16位,也就是说这个数要小于0.15,大概为0.1499999999999,所以经过上面的运算后事实上大概2.999999999999,然后再floor一下你就明白了。记得给最优答案
老陌
老陌
回复 @opso : 你试一试java呢,Math.floor(60 * (0.15/3)) 。这种东西不是语言自身的问题。
opso
opso
学习了。。。发现这个精度问题简直惊呆,java或者其他语言没有这个问题吧。。 还有一种方法round 返回将 x 根据指定精度 prec (十进制小数点后数字的数目)进行四舍五入的结果。prec 也可以是负数或零(默认值)。
木兰宿莽
木兰宿莽
现在发现,没事不要总去搞些边际的东西,稍有差错就会崩盘,所谓失之毫厘,差之千里
0
hyjiacan
hyjiacan
0.15/3 小于  0.05。。所以后面。。
opso
opso
:)以后除法运算问题心惊胆战
0
聽雨人
聽雨人
你百度一下:bcmath
聽雨人
聽雨人
回复 @opso : 这个问题,一般来说还真得用bcmath
opso
opso
到了添加扩展的地步就很严重了。。
0
旁边白
旁边白
浮点数计算看下大学的计算机组成原理吧,里面不是讲的清清楚楚嘛,floor再看下PHP源代码的处理方式不就行了嘛
opso
opso
是的 其实搜下文档就知道问题了
0
Eaglexu
Eaglexu
floor( 60 * bcdiv(0.15, 3, 4) )
Eaglexu
Eaglexu
@opso 属于bc math的库,编译需要--enable-bcmath
opso
opso
php5.3我试了下为什么是undefined function.. 按道理这个应该是可以解决问题的
0
bobdog1986
bobdog1986
float、double都是以一个精度存数的,比如偶尔还能在一些商店、超市的收银条上看到xx.9999999元
0
opso
opso
感谢各位大神的建议。。
0
wuyiw
wuyiw
之前JS里也遇到类似问题, 这是个坑, 得注意.
0
都市网达
都市网达
http://www.laruence.com/2013/03/26/2884.html  

 PHP浮点数的一个常见问题的解答

opso
opso
鸟哥写的2333 感谢分享
返回顶部
顶部