84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
`var_dump(ceil(2.2*100)/100); var_dump(ceil(strval(2.2*100))/100);`
输出的结果分别是float 2.21float 2.2为什么这两种情况的值会不同?大神求解。
认证高级PHP讲师
从某乎上看到的答案。虽然还是不明白底层原理。
浮点小数很多普通的十进制小数在二进制下并不是有限位的小数,有限的数值位并不能精确地记录数字的值所以你以为的2.20在echo sprintf('%10.30f', 2.20*100);的时候看到的会是220.000000000000028421709430404007
可能这和ceil二关,是浮点运算的问题吧。
结合 @jsutking 的实验,很容易理解第1个的答案是 2.21,因为它是 ceil(220.000000000000028421709430404007) 的结果。
ceil(220.000000000000028421709430404007)
而第 2 个,估计是 strval(2.2 * 100) 的时候自动取了一个不大的精度,ceil(220.0000000000000) 算出来都是 220 啦。
ceil(220.0000000000000)
从某乎上看到的答案。虽然还是不明白底层原理。
浮点小数
很多普通的十进制小数在二进制下并不是有限位的小数,有限的数值位并不能精确地记录数字的值
所以你以为的2.20在
echo sprintf('%10.30f', 2.20*100);
的时候
看到的会是
220.000000000000028421709430404007
可能这和ceil二关,是浮点运算的问题吧。
结合 @jsutking 的实验,很容易理解第1个的答案是 2.21,因为它是
ceil(220.000000000000028421709430404007)
的结果。而第 2 个,估计是 strval(2.2 * 100) 的时候自动取了一个不大的精度,
ceil(220.0000000000000)
算出来都是 220 啦。