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

如何在C# DataTable中将两列数值相加得到最终金额?

问题分析与修复方案

嘿,我一眼就看出问题啦——你直接用DataRow的索引器取值后做加法,其实是在做字符串拼接,而不是数值加法!

为什么会这样?

dtOrdersDetail.Rows[i]["ComboAmount"]返回的是object类型,当你用+运算符连接两个object时,.NET会默认把它们转换成字符串再拼接,比如如果两个列的值都是2,结果会是"22"而不是4,这肯定不是你想要的。

另外,你原来的代码还有个小疏漏:创建了新行dtItemRow,但没把它添加到dtOrderReceipt里,就算计算对了,最终目标DataTable里也不会有数据哦。

修复后的代码

针对金额场景,我推荐用decimal类型来处理(避免浮点精度丢失),修复后的代码如下:

for (int i = 0; i < dtOrdersDetail.Rows.Count; i++) 
{
    DataRow dtItemRow = dtOrderReceipt.NewRow();
    
    // 安全转换列值为decimal类型,处理可能的DBNull情况
    decimal comboAmount = dtOrdersDetail.Rows[i]["ComboAmount"] != DBNull.Value 
        ? Convert.ToDecimal(dtOrdersDetail.Rows[i]["ComboAmount"]) 
        : 0m;
    decimal totalPrice = dtOrdersDetail.Rows[i]["TotalPrice"] != DBNull.Value 
        ? Convert.ToDecimal(dtOrdersDetail.Rows[i]["TotalPrice"]) 
        : 0m;
    
    // 执行真正的数值加法
    dtItemRow["FinalAmount"] = comboAmount + totalPrice;
    
    // 必须把新行添加到目标DataTable中
    dtOrderReceipt.Rows.Add(dtItemRow);
}

额外说明

  • 如果你的列类型是整数(比如int),可以把decimal换成int,用Convert.ToInt32来转换;
  • 用DBNull.Value判断是为了避免数据库空值导致的转换异常,如果你确定列不会为空,可以简化成Convert.ToDecimal(dtOrdersDetail.Rows[i]["ComboAmount"]);
  • 金额计算一定要用decimal,别用double或者float,不然会出现类似0.1+0.2=0.30000000000000004的精度问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:16:46