php向下保留两位小数有以下几个办法
这里先介绍下传统的php的保留两位小数,
我们以$num = 1.269为例子。我们是想得到1.26这样的数字。
然后再说明我写这篇文档的必要性
一、传统的保留两位小数
- 第一种,使用round()函数
echo round($num,2); //1.27
round会默认使用四舍五入的,与我们的需求不符
- 第二种,利用sprintf格式化字符串
echo sprintf("%.2f",$num); // 1.27
同样,sprintf的操作也是一样的效果,会自动四舍五入的。
- 第三种,利用千位分组来格式化数字的函数number_format()
echo number_format($num, 2); //1.27
结局也是一样的。
再看我们的需求,传统的方法都不能达到目的。当然非传统的方法也有几种。
二、非传统的向下保留两位小数的方法
- 先对数字乘以100,然后再向下取整,最后再除以100
echo floor(1.269*100)/100; // 1.26
这种方法原理上也没问题,思路也正确,也能得出正确的答案。似乎能解决我们的问题。
看看下面的计算:
echo floor(5.1*100)/100; // 5.09
咦~。怎么回事,这么简单的,都计算错了。
这里如果还在懵逼的同学们,可能你需要去补下精度的知识了。这里不做讲解。知道这样的计算有可能会算错的,就行啦。
- 鉴于第一计算会出错,而且这种计算错误不单单是php语言,所有语言都有的,所以php也提供了高精度的计算方式bcmath函数。
现在就这个操作举个例子,我们是要经常乘法的计算,所以,用到bcmul方法
echo bcmul(5.1, 1, 2); // 5.1
echo bcmul(1.269, 1, 2); // 1.26
使用高精度的计算方法,保证结果正确,计算不出错。但是这个函数对环境有依赖的,不是随便的php环境都支持的。我们公司的本地环境支持,线上环境不支持的。所以后来就又找了其他的方法。
- 把浮点数当做字符串来处理,进行截取的操作
$pos = stripos(1.269, '.');
echo substr(1.269, 0, $pos+3); // 1.26
这种方法比较单一,不适用计算,也不用担心计算出错。无论小数点后是否有数字,都可以精确舍去。
- 使用正则提取自己需要的数字
$arr = array();
$preg = 1.269;
$mattch = "/\w+.\w{2}/";
$result = preg_match($mattch,$preg,$arr);
echo $arr[0]; //1.26
这种方法,也能到自己的想要的结果
- 之前说了格式化字符串没办法直接得到我们想要的结果,但是可以转换下,格式化字符串到小数点后面的4位,然后,取后两位就可以了。
$num = number_format(1.269, 4);
$num = substr($num, 0, -2);
echo $num; // 1.26
可能你会疑问,为啥是四位,三位不就行了。你要知道,number_format会四舍五入的。如果第三位是9的话,会进1的。
举个例子:
$num = number_format(1.2697, 3);
$num = substr($num, 0, -1);
echo $num; // 1.27
其实第5中方法是不行的,不信,你试试1.99999999999999999,这样的数字向下保留个试试,牵扯到四舍五入的操作,会有误差的。
ok,这是目前能想到的所有向下保留两位小数的操作。