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

如何使用Joi精确校验十进制数字的小数精度

Joi小数精度严格校验实现方案

Joi内置的number().precision(n)方法默认仅会将超出精度的数值四舍五入到指定位数后通过校验,不会拦截超出精度的输入值,若要实现严格校验,可通过以下两种方案实现:

方案1:数值类型自定义校验

适合确认入参为数值类型、无JS浮点精度异常风险的场景,自定义校验逻辑判断小数位数:

f_num: Joi.number()
  .required()
  .custom((value, helpers) => {
    // 拆分整数和小数部分判断位数
    const decimalStr = value.toString().split('.')[1];
    if (decimalStr && decimalStr.length > 3) {
      return helpers.error('number.precision', { limit: 3 });
    }
    return value;
  })
  .messages({
    'number.precision': 'f_num字段最多允许3位小数'
  })

方案2:字符串正则校验

适合对精度要求极高,需要避免JS浮点运算导致位数判断误差的场景,先以字符串格式校验格式,再按需转为数值:

f_num: Joi.string()
  .required()
  .pattern(/^\d+(\.\d{1,3})?$/)
  .message('f_num字段必须为数值,且最多保留3位小数')
  // 校验通过后转为数值类型
  .custom(val => Number(val))

内容的提问来源于stack exchange,提问作者neil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:06:04