如何使用Zod验证数字最多包含2位小数?
Zod验证数字最多保留2位小数的实现方法
Zod本身没有内置的数字小数位数验证规则,但可以通过refine方法添加自定义逻辑来实现,这里提供两种可靠的方案:
方案一:通过字符串分割验证小数位数
直接将数字转为字符串,拆分整数和小数部分,检查小数部分长度不超过2位:
import { z } from "zod"; // 定义最多两位小数的数字验证规则 const MaxTwoDecimalsNumber = z.number().refine( (num) => { const [, decimalPart] = num.toString().split('.'); // 无小数部分 或 小数部分长度≤2 即符合要求 return decimalPart ? decimalPart.length <= 2 : true; }, { message: "数字最多只能保留2位小数" } ); // 应用到你的对象Schema中 const TargetSchema = z.object({ numericProp: MaxTwoDecimalsNumber });
测试示例:
// 合法场景 TargetSchema.parse({ numericProp: 1 }); // 正常通过 TargetSchema.parse({ numericProp: 1.1 }); // 正常通过 TargetSchema.parse({ numericProp: 1.11 }); // 正常通过 // 非法场景 TargetSchema.parse({ numericProp: 1.111 }); // 抛出验证错误
方案二:处理浮点数精度问题(推荐用于金额等精确场景)
由于JS浮点数存在精度误差(比如0.1 + 0.2 = 0.30000000000000004),直接转字符串可能误判,这种情况下可以用数学运算来验证:
import { z } from "zod"; const MaxTwoDecimalsNumber = z.number().refine( (num) => { // 核心逻辑:数字乘以100后取整,与原数乘以100的结果相等,说明最多两位小数 return Math.round(num * 100) === num * 100; }, { message: "数字最多只能保留2位小数" } ); // 对象Schema用法同上 const TargetSchema = z.object({ numericProp: MaxTwoDecimalsNumber });
这个方法能规避浮点数精度带来的误判,比如0.30000000000000004会被正确识别为合法的0.3,而真正的三位小数(如1.111)会被拦截。
内容的提问来源于stack exchange,提问作者Uri
相关产品推荐
相关产品推荐

