PHP如何实现指定位数小数的floor向下取整与ceil向上取整
指定位数小数的向上/向下取整实现方案
核心实现逻辑:原生floor()、ceil()函数仅支持取整到整数位,要实现保留N位小数的定向取整,只需先将原数放大10^N倍,把目标保留位移动到整数位,调用对应取整函数后,再缩小相同倍数还原即可。
针对0.666667保留1位小数的实现代码
- 向下取整(得到0.6)
$original = 0.666667; $decimals = 1; $scale = pow(10, $decimals); $floorResult = floor($original * $scale) / $scale; // 输出:float(0.6)
如果需要固定输出1位小数的字符串格式(规避浮点数精度导致的显示异常),可以在取整完成后再调用格式化函数,此时不会触发四舍五入:
echo number_format($floorResult, 1, '.', ''); // 输出:string(3) "0.6"
- 向上取整(得到0.7)
逻辑完全一致,仅需将floor()替换为ceil()即可:
$original = 0.666667; $decimals = 1; $scale = pow(10, $decimals); $ceilResult = ceil($original * $scale) / $scale; // 输出:float(0.7)
原有方案不生效的原因
- 直接调用
number_format((float)0.66667, 1, '.', ''):该函数默认采用四舍五入规则处理小数,没有提供指定舍入方向的参数,无法单独实现向下截断的取整需求 - 直接调用
floor(0.66667):该函数的作用是返回不大于输入值的最大整数,0.66667小于1,因此直接返回整数0,无法满足保留小数位的需求
注意:普通浮点数运算存在固有精度误差,若为金融等对精度要求极高的场景,建议使用BCMath系列高精度函数替代原生算术运算,避免放大过程中出现类似
0.666667 * 10 = 6.666669999999999的偏差导致取整结果错误。
内容的提问来源于stack exchange,提问作者Dror Shalit
相关产品推荐
相关产品推荐

