php中保留小数的常见方法

php中保留小数的常见方法

对于保留几位小数的处理,方法有很多,思路上主要有两种,一种是当作数字来通过计算来实现;另一种则是把变量当作字符串,通过字符串的一系列截取操作来实现。当然具体使用要根据实际业务情况来使用。实际情况也大概三种,分别是,四舍五入、舍弃后面、进一位三种(类似取整时的四舍五入、向下取整、向上取整)。

思路一,当作数字(float)来进行处理

大致用到下面几个方法

  • 直接取整:intval()
  • 向下取整:floor()
  • 四舍五入取整:round()
  • 向上取整:ceil()

利用以上函数做保留两位小数的操作,思路也很简单,就是利用乘除,和各种取整实现,看下面例子:

$number = 1512.15532;
echo var_dump(intval($number*100)/100).'<br/>';//保留两位小数,直接舍弃后面
echo var_dump(floor($number*100)/100).'<br/>';//保留两位小数,直接舍弃后面
echo var_dump(round($number*100)/100).'<br/>';//保留两位小数,四舍五入
echo var_dump(ceil($number*100)/100).'<br/>';//保留两位小数,若有第三位,则第二位小数进1

这里写图片描述

很简单,一目了然。

思路二,字符串截取

采用字符串,常用的方法有三个

  • sprint()
  • number_format()
  • 自定义截取
$number = 1512.15532;
echo var_dump(sprintf('%.2f',$number)); //会四舍五入
echo var_dump(number_format($number2,2,'.',','));//会四舍五入

这里写图片描述

上面采用的也是现成的方法,比较简单,至于保留两位小数后是否进行四舍五入,可以根据灵活处理。

重点讲下自定义的方式处理

思路很简单,利用小数点把字符串编程数组,再截取和拼接。

function format2($val){
    $arr = explode('.',$val);
    $data = $arr[0].'.'.substr($arr[1],0,2);
    return $data;
}
$number = 1512.15532;
echo var_dump(format2($number));

这里写图片描述
上面例子没采用四舍五入的方式,是直接截取。具体究竟需不需要四舍五入,字符串截取和数字计算灵活运用即可达到,不赘述。

建议,以字符串操作为主。

很简单的东西,没什么还需要写一篇总结出来呢,因为在一次项目开发中,需求是保留两位小数,不去四舍五入,我习惯性的利用数字函数来进行操作,但是在一处需要进行累加操作的地方,处于处女座的强迫症,累加的结果,再次进行了格式化。结果出现了问题,大致就是在 floor()的时候,比预期结果小1(例子,floor(2.65 * 100) /100 = 2.64 ),自己重写的例子又正常。 通过咨询大佬,才意识到,内存在保存浮点数的时候并不是精确的,会根据他之前的计算来决定内存是如何存储的。 然后我在错误的地方验证了下 floor(2.65*1000)/1000 = 2.648(例子只在说明情况)。所以,以后为了避免相同的错误,要尽量才用字符串的方式去实现。 本小结也是为了记住本次坑。

猜你喜欢

转载自blog.csdn.net/qq_32142513/article/details/79281485