You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:45:59