<p>PHP中字符串转float需谨慎:floatval()和(float)从左取连续数字并自动trim空格,非数字字符串返回0.0;数组转换推荐array_map('floatval', $arr);浮点数比较须用误差范围abs($a - $b) < EPSILON。</p>

PHP里没有“浮点类型怎么用”这种抽象问题,只有具体场景下怎么安全、准确地把值变成 float,以及怎么避免掉进精度坑里。
字符串转 float 时怎么不丢数也不报错
字符串转 float 最常踩的坑是:带单位的("123.45kg")、开头有空格(" 42.0")、纯字母("abc")或 "NaN"。不同方法行为差异很大:
-
floatval()会从左往右取连续数字部分,遇到非数字字符就停:floatval("122.34343The")→122.34343 - 强制转换
(float)行为一致,但更轻量:(float)" 7.89px"→7.89(自动 trim 空格) -
settype($var, "float")是原地修改,返回布尔值,不是新值;$var变成float后,gettype($var)才是"double"(PHP 内部仍叫 double) - 如果字符串完全不包含数字(如
"hello"),两种方式都返回0.0,不会警告也不会报错
数组批量转 float 怎么选函数
一维数组推荐用 array_map('floatval', $arr) —— 安全、不可变、语义清晰。它对每个元素调用 floatval,非数值转 0.0,不中断执行。
若需原地修改且内存敏感(比如处理上万条日志数据),可用 array_walk():
立即学习“PHP免费学习笔记(深入)”;
function to_float(&$item) { $item = (float)$item; }
array_walk($arr, 'to_float');
注意:array_walk 不支持多维数组;要处理嵌套结构,得自己写递归,或先 json_encode + json_decode(但会丢失资源、对象等类型)。
为什么 0.1 + 0.2 !== 0.3 还能用
这不是 PHP 的 bug,是 IEEE 754 双精度浮点数的固有局限。PHP 默认用 64 位格式存储 float,0.1 在二进制中是无限循环小数,只能近似存储。
- 比较两个
float是否“相等”,必须用误差范围:abs($a - $b) - 显示给用户看时,用
number_format($val, 2)或sprintf("%.2f", $val),别依赖== - 做金额运算?别用
float。改用整数分单位(如 1299 表示 ¥12.99),或扩展如bcmath(bcadd("0.1", "0.2", 1))
什么时候不该用 floatval() 或 (float)
floatval() 和强制转换都不接受数组或对象 —— 传进去会警告并返回 0.0。如果你不确定输入类型,先判断:
if (is_scalar($input)) {
$f = (float)$input;
} else {
throw new InvalidArgumentException('Only scalar values allowed');
}
另外,floatval(null) 返回 0.0,(float)false 也是 0.0,(float)true 是 1.0。这些隐式转换容易掩盖逻辑错误,尤其在表单解析或 API 输入校验时。
真正麻烦的从来不是“怎么转”,而是“转完之后怎么确认它还是你想要的那个数”。浮点数不是数学实数,它是一组离散近似值——这点一旦忽略,后面所有计算都可能漂移。



















