关于PHP的浮点运算取floor(3)得到结果2的奇怪问题

来源:互联网 发布:淘宝发展趋势 编辑:程序博客网 时间:2024/05/21 01:45



$amount = 300;$num = 1.2;$num = $num - 1.1;$num = floatval($num);var_dump($num);$amount = ($num * $amount) / 10;var_dump($amount);var_dump(floor($amount));exit;


结果:


float 0.1
float 3
float 2


结果超乎你想象,PHP的浮点运算,就是这么坑。。。。。。



过了两个小时,找到解决办法,如下:


$amount = 3000;$num = 1.2;$num -= 1;// $amount = $num * $amount / 10;$amount = bcmul($num, $amount) / 10;echo $amount . "\n";echo floor($amount);exit;



关于bcmul,可以参考这里:


http://php.freehostingguru.com/function.php-bcmul.php



关于这个问题,可以参考这里:


http://stackoverflow.com/questions/812815/php-intval-and-floor-return-value-that-is-too-low


我要赞叹的是国外每次对问题的讨论都非常深入。




另外关于这个问题,我们平时使用PHP进行的计算都太不严谨,如果要进行精确的计算,不想出现意外结果的计算的话,要使用BC函数库,如下:


http://php.freehostingguru.com/group.php-5.php


要使用 BC 这个函数库,要在编译 PHP 程序时加入 --enable-bcmath 的选项。bcadd:将二个高精确度数字相加。bccomp:比较二个高精确度数字。bcdiv:将二个高精确度数字相除。bcmod:取得高精确度数字的余数。bcmul:将二个高精确度数字相乘。bcpow:求一高精确度数字次方值。bcscale:配置程序中所有 BC 函数库的默认小数点位数。bcsqrt:求一高精确度数字的平方根。bcsub:将二个高精确度数字相减。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝私处好红怎么办呢 甲亢难怀孕怎么办才好 怀孕8周查出甲亢怎么办 电动车被交警拖走了怎么办 电动车车被城管拖走了怎么办 12123地理反编码失败怎么办 苹果手机地理反编码失败怎么办 城管执法过程被打怎么办 老婆看不起老公不让碰怎么办 老婆总不让碰该怎么办 机动车扣满12分怎么办 吊车吊运货物失控应该怎么办 车辆违章扣6分怎么办 最新交通法扣满12分怎么办 违章停车单丢了怎么办 违停告知单掉了怎么办 违章停车扣3分怎么办 驾驶证被扣12分怎么办 被贴条了条丢了怎么办 车停路边连续几天被贴条怎么办 车停在路边限号怎么办 违停的罚单丢了怎么办 借道左转红灯了 怎么办 道路上有锯齿线标志怎么办 被领导臭骂了一顿怎么办 酒驾撞了人逃跑怎么办处理 荣耀9home键掉了怎么办 今天开车把老太婆撞了怎么办 交通责任认定书不合理怎么办 交通事故救济金用了 没钱还怎么办 车脏了洗不干净怎么办 衣服上贴花掉了怎么办 衣服上的画掉了怎么办 衣服上沾了胶怎么办 补鞋胶弄衣服上怎么办 摩托车大灯里面掉漆怎么办 行驶中轮胎爆胎怎么办 左拐车道直行了怎么办 踏板摩托车淋雨打不着火怎么办 购房小蓝本丢了怎么办 3d下载模型没颜色怎么办