如何使用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
相关产品推荐
相关产品推荐

