yii2中验证浮点数应使用double验证器,它严格区分整数与小数;默认接受字符串形式小数,需配合filter预处理转为float以确保类型安全;strict模式仅允许原生float类型,适合api场景。

在Yii2中验证用户输入的浮点数类型,必须确保字段值能被识别为小数(如 3.14、-0.5、1e-3),同时避免整数、字符串或空值误通过校验。
使用 double 验证器
Yii2 官方推荐用 double 验证器校验浮点数,它基于 yii\validators\NumberValidator,严格区分整数与小数。
第一步:在模型的 rules() 方法中添加规则:
[['price'], 'double']
这会拒绝 100(整数)、"100.0"(未启用 strict 模式时可能通过)、null 和空字符串。但注意:【默认不拒绝字符串形式的小数,如 "3.14"】——因为 PHP 的 is_numeric("3.14") 返回 true,而 Yii2 的 double 默认依赖此判断。
第二步:若需强制要求原始输入就是 float 类型(而非字符串),应配合 filter 预处理:
[['price'], 'filter', 'filter' => function ($value) { return is_string($value) ? (float)$value : $value; }],[['price'], 'double']
这样可把字符串 "2.99" 转为 float 后再校验,避免后续业务中因类型混用引发精度或比较异常。
用 number 验证器替代 double?
方法一:直接使用 number
[['amount'], 'number']
⚠️ 注意:这和 double 完全等价,是同一验证器的别名,源码中两者都映射到 NumberValidator。不要误以为 number 更“宽松”或更“通用”——行为完全一致。
方法二:启用 strict 模式提升精度控制
[['temperature'], 'double', 'strict' => true]
启用后,仅当 PHP 中 gettype($value) === 'double' 或 'float' 时才通过,"36.6"、366/10(结果为 float)可过,但 36.6 字面量(PHP 会存为 float)也通过;而 intval(36.6) 得到的整数 36 则一定失败。该模式适合 API 接收 JSON 浮点字段的场景,但 Web 表单 POST 通常收不到原生 float,慎用。
限制取值范围并定制提示
1. 设置最小值与最大值:
[['salary'], 'double', 'min' => 0.01, 'max' => 999999.99]
2. 指定超出范围时的错误信息:
[['rate'], 'double', 'min' => 0.0, 'max' => 1.0, 'tooSmall' => '折扣率不能小于 0', 'tooBig' => '折扣率不能大于 1']
3. 若允许科学计数法输入(如 1.23e-4),无需额外配置——double 默认支持,但前端需确保表单 <input type="number"> 允许 e 符号,否则浏览器可能截断。











