ASP.NET中C#多条件判断异常:MySQL Decimal值判断结果不符
问题分析与解决方案
看起来你的问题出在数值解析的文化格式不匹配上,我们一步步拆解解决:
问题根源
你的MySQL表中B、C字段存储的是带逗号的数值(比如16,11、3,08),这是欧洲地区常用的「逗号作为小数点分隔符」格式,但Convert.ToDouble默认会使用当前线程的文化设置(比如中文/英文文化里,逗号是千位分隔符、点才是小数点)。
这就导致:
16,11会被错误解析为1611.0(虽然这个值满足B>1)3,08会被错误解析为308.0,显然不满足C >=1 && C <=4的条件,最终整个判断返回false
解决方案
这里有几种可靠的解决方式,按推荐程度排序:
1. 用decimal类型匹配数据库字段(推荐)
因为数据库字段是Decimal(10,2),直接用C#的decimal类型对应,既能避免浮点精度损失,又能准确解析带逗号的数值:
// 指定支持逗号小数点的文化(比如法国、德国文化) var euroCulture = System.Globalization.CultureInfo.GetCultureInfo("fr-FR"); decimal A = Convert.ToDecimal(dt.Rows[0]["A"], euroCulture); decimal B = Convert.ToDecimal(dt.Rows[0]["B"], euroCulture); decimal C = Convert.ToDecimal(dt.Rows[0]["C"], euroCulture); // 判断时使用decimal字面量(加m后缀) if (A < 0.1m && B > 1m && (C >= 1m && C <= 4m)) { // 将D列设为true }
2. 替换逗号为小数点后再转换
如果你坚持用double,可以先把字符串中的逗号替换为点,再进行转换:
// 处理A字段 string aStr = dt.Rows[0]["A"].ToString().Replace(',', '.'); double A = Convert.ToDouble(aStr); // 处理B字段 string bStr = dt.Rows[0]["B"].ToString().Replace(',', '.'); double B = Convert.ToDouble(bStr); // 处理C字段 string cStr = dt.Rows[0]["C"].ToString().Replace(',', '.'); double C = Convert.ToDouble(cStr); // 执行判断 if (A < 0.1 && B > 1 && (C >= 1 && C <= 4)) { // 将D列设为true }
3. 指定文化转换double
和第一种思路类似,但用double类型:
var euroCulture = System.Globalization.CultureInfo.GetCultureInfo("de-DE"); double A = Convert.ToDouble(dt.Rows[0]["A"], euroCulture); double B = Convert.ToDouble(dt.Rows[0]["B"], euroCulture); double C = Convert.ToDouble(dt.Rows[0]["C"], euroCulture); if (A < 0.1 && B > 1 && (C >= 1 && C <= 4)) { // 将D列设为true }
额外提示
尽量避免用double处理精确的小数(比如金额、计量值),因为浮点数存在精度丢失问题,用decimal和数据库的Decimal类型对应是更稳妥的选择。
内容的提问来源于stack exchange,提问作者user3368883
相关产品推荐
相关产品推荐

