金额字符串转整型应先用round((float)$str)四舍五入,避免intval()截断致资损;需预处理字符串(去除非数字字符),高精度场景优先用BCMath函数。
PHP 金额字符串转整型时,round 是默认安全选择
直接用 intval() 或强制类型转换 (int) 会截断小数,比如 "19.99" 变成 19,这在金额场景下属于资损。必须先做舍入再转整——而 round() 默认四舍五入,最符合财务常见规则。
注意:输入是字符串(如 "123.456"),别忘了先转为 float,否则 round("123.456") 会触发 notice(PHP 8+ 会警告)。
-
round((float)"123.456")→123 -
round((float)"123.5")→124 - 不推荐
round("123.456")(隐式转换不可靠,PHP 版本间行为可能不一致)
需要向上取整(如计费按“进一”算)必须用 ceil,但要防字符串陷阱
ceil() 接收 float,传字符串会先转 float;但如果字符串含空格、逗号或单位(如 "1,299.99" 或 "¥1299.99"),直接调用会得到 1(因 PHP 将非数字前缀截断后解析)。
- 先清理:用
preg_replace('/[^0-9.]/', '', $str)提纯数字字符 - 再转 float:
$num = (float) preg_replace('/[^0-9.]/', '', "¥1,299.99")→1299.99 - 最后
ceil($num)→1300 - 别写
ceil("1299.99")—— 虽然能运行,但属侥幸,PHP 8.1+ 已标记为 deprecated
floor 在金额场景极少用,除非明确要求“舍去小数部分”
例如优惠券面额向下取整到元("29.99" → 29),此时 floor((float)$str) 是对的。但它和 intval() 表现不同:floor(-1.9) 是 -2,而 intval(-1.9) 是 -1 —— 负金额若存在,这点差异会影响结算逻辑。