C#中如何校验用户输入的浮点值严格等于整数1,避免精度损失问题
正确校验实现方案
问题原因
你原有代码的问题在于Convert.ToInt32()处理double类型时会执行四舍五入逻辑,只要输入值落在[0.5, 1.5)区间内都会被转换为整数1,因此会出现1.001被误判通过的问题。
推荐实现
方案1:直接double比较(适合输入直接从字符串转double的场景)
直接判断double值是否精确等于1.0即可,用户输入的1.00、1.0000等格式的值转换为double后都是标准的1.0,不会出现误判:
public bool Validate(double number) { return number == 1.0d; }
方案2:带精度容差的比较(适合double值经过运算的场景)
如果传入的double值是经过算数运算得到的,可能存在浮点数精度误差,可以增加极小的容差阈值避免误判:
public bool Validate(double number, double tolerance = 1e-9) { return Math.Abs(number - 1.0d) < tolerance; }
你可以根据业务允许的精度调整tolerance的值,示例中1e-9代表允许的误差小于十亿分之一,完全可以过滤掉1.001这类不符合要求的值。
方案3:基于原始输入字符串校验(最高精度)
如果能拿到用户输入的原始字符串,推荐用decimal类型做校验,完全避免二进制浮点数的精度丢失问题:
public bool Validate(string input) { if (!decimal.TryParse(input, out decimal inputNum)) { return false; } return inputNum == 1m; }
这种方式对任意格式的合法十进制输入都可以精准判断,不会出现任何精度误差问题。
内容的提问来源于stack exchange,提问作者VA1267
相关产品推荐
相关产品推荐

