php中的round函数的bug

来源:互联网 发布:淘宝子账号有风险吗 编辑:程序博客网 时间:2024/03/29 17:33
    我在写一个phpexcel操作数据时发现的,在php中,使用php中的round函数功能,并不完美,别的语言我不保证。
    我用phpexcel在操作十几万的数据的时候吧,我发现有些数据并没有给我理想的四舍五入。问题出在。0.5这个问题上,有些测试可以进1,有些不可以,我搜不少资料,在一个日本人写的回复贴上也写有关于这个问题,php中的round并不能很好的完成我们想要的。我问了几个朋友,他们都不清楚,连一个做net的也不清楚。
    我最后想有没有,我自己的想要的效果呢?于是我改写了round一点点,算打个小补丁吧。代码如下

function round_all($manage,$parameter){
    $tmp=$manage+1/pow(10,$parameter+1);
    if(substr($tmp,strpos($tmp,'.')+$parameter+1)>5){
        return round($tmp,$parameter);//用保留位的后一位加1,做round
    }else{
        return round($manage,$parameter);//如果等于小于5,做原值round
    }
}
这个代码,就完成的保证了四舍五入,在要进位的后一位为5的时候,一定能够进1.原理很简单,主要思想是,在pow指数这里,保证了保留位的后一位加一,然后用得到的新数再用round处理,这样就排除了进位位,末尾一位杜绝为5不进1的情况。效果测试,可以。
 图片
这是一位php群里的朋友,我忘记叫什么名字了。谢谢他当时发了这个。 
我测试的是
round(145.51*1750,0); 实际算的结果是254642.5,函数运算的结果没有给我进一,而是直接砍掉0.5,导致缺少0.5

哎!随便说一句,不要都说国外做的东西,多好多有素质,中国人素质差了。看这个,这么多写编程的书,这么多年,包括官方的手册,都没有写,round其实内部是有bug的。都是自己测试后才发现有问题。作者的介绍没有一个字会告诉你,我的东西其实是有问题的。
讲的有点乱,顺序没有排好,主要的都说出来了。
白纸 2015年1月26写 
0 0
原创粉丝点击