又一个非常怪异的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标准。规格化数时。因为有效位有限就会产生精度的损失。如果楼主想要了解的更清楚可以查阅计算机组成原理书籍。多数在第一或第二章就有详细的解释。如果只想会用。就记得达人的话。永远不要相信浮点数是精确的! php 接收邮件正文是乱码,求如何解决 PHP支持联盟②群:87768463 PHP技术交流 怎么用网站语言编写关机程序?? 请高人进来看看 简单问题 编辑文章出错,这段代码有什么问题? 为何不会输出任何数据 请问怎样实现再线用手机付费 请问在php中,ereg()的作用时什么? 我安装了PHPTriad V2.21 之后为什么不能显示PHP页面的内容啊 大家搞技术常去哪些网站? 求救,关于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 函数。 这个现象是格式转换时精度损失所造成的。