又一个非常怪异的php基本问题,窃以为是bug 测试了一下,就是91。PHP的此bug不存在,鉴定完毕 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我这测试结果111难道是,这个是php5.x才有的问题??回家试验下,家里面可是3.x 4.x都有的说ceil:计算大于指定数的最小整数。 不过,在这用的IIS+php,回家用apache+php测试吧 91WindowsXP + Apache2 + PHP5 echo ceil(100/1.1); 疯掉了吧 晕,我按/算的……echo ceil(100*1.1); //111 <?phpprintf('%.14f<br>', 100*1.1);echo ceil(100*1.1);echo '<br>';printf('%.14f<br>', 100/1.1);echo ceil(100/1.1);?>110.0000000000000111190.9090909090909191有什么问题吗?ceil 返回不小于传入参数的最小整数 因为1.1是浮点型,浮点型*100还是浮点型,1.1*100=110.00...,ceil后就变成111了,就是这样,不是bug 没有问题啊,这个ceil在php4/5版本下都没有问题! printf('%.14f<br/>', 100*1.1);echo ceil(100*1.1);为啥是110.00000000000001呢? 因为小数点后取14位,这样;<?printf('%.1f<br/>', 100*1.1);echo ceil(100*1.1);?>就是110.0 结果还是111。 printf('%.14f<br/>', 100*1.1);echo ceil(100*1.1);为啥是110.00000000000001呢?-------------------------------这个是基础知识.... 这算什么BUG.晕自己用这函数难道不清楚这函数和特性? 我是说为什么100*1.1=110.00000000000001------------------------------------------计算机处理整型值很精确,但处理小数时用 float 或 double 浮点类型就会有误差了,而且这是不可避免的。 来北京了。呵呵。谢谢zeroleonhart 我来拿分首先要了解php的变量类型,他明确的声明了这个问题。十进制的分数在转换为二进制的格式时,可能会丢失一点点精度。像 0.1 或0.7不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。这里的ceil(100*1.1)返回的不是预期中的110而是111,应该是该结果内部表示其实是类似110.000000...1(中间不大于14个零)。再看ceil (100*1.3) 返回的就是我们预期中的130而不是延续上面的131。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。 这个现象是格式转换时精度损失所造成的。 楼上的楼上是达人。浮点型保存在计算机中转换成2进制要进行一次数据的规格化。比如在C中浮点数的表示遵循IEEE 754标准。规格化数时。因为有效位有限就会产生精度的损失。如果楼主想要了解的更清楚可以查阅计算机组成原理书籍。多数在第一或第二章就有详细的解释。如果只想会用。就记得达人的话。永远不要相信浮点数是精确的! PDO查询字段类型为float型的问题 PHP 生成 XML 如何添加外部样式表 XSL 关于php正则替换 php复制目录文件及其子目录下所有文件 探讨 显示日期的格式问题 if判断句中如何输入html语句 ajax读数据库的问题 php能不能检测用户是否打开过一个特定的连接 php咋连接sqlserver window身份验证数据库啊?? 怎麼裝了PHP5後沒有DOMXML? 大家搞技术常去哪些网站? 求救,关于ip的正则匹配
WindowsXP + Apache2 + PHP5
printf('%.14f<br>', 100*1.1);
echo ceil(100*1.1);
echo '<br>';
printf('%.14f<br>', 100/1.1);
echo ceil(100/1.1);
?>
110.00000000000001
111
90.90909090909091
91
有什么问题吗?
ceil 返回不小于传入参数的最小整数
echo ceil(100*1.1);为啥是110.00000000000001呢?
这样;
<?
printf('%.1f<br/>', 100*1.1);
echo ceil(100*1.1);
?>
就是110.0 结果还是111。
echo ceil(100*1.1);为啥是110.00000000000001呢?-------------------------------
这个是基础知识....
计算机处理整型值很精确,但处理小数时用 float 或 double 浮点类型就会有误差了,而且这是不可避免的。
首先要了解php的变量类型,他明确的声明了这个问题。十进制的分数在转换为二进制的格式时,可能会丢失一点点精度。像 0.1 或0.7不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。这里的ceil(100*1.1)返回的不是预期中的110而是111,应该是该结果内部表示其实是类似110.000000...1(中间不大于14个零)。再看ceil (100*1.3) 返回的就是我们预期中的130而不是延续上面的131。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。 这个现象是格式转换时精度损失所造成的。