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

