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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:22:32