我需要比较来自具有相同架构的两个数据表的数字数据。例如两个包含数据的表,例如
PK专栏 | 数列 | 小数列
合并后会变成这样
PK专栏 | 数列 1 | 数列 2 | numCol 差异 | 小数列 1 | 小数列 2 | DecimalCol 差异
最初,我只是将 diff 列创建为表达式 col1-col2 但我最终会得到不寻常的值
col1 col2 diff c1 c2 diff
12.8 14.6 -1.80000019 33.2 29.8 3.40000153
但我想要的是:
col1 col2 diff c1 c2 diff
12.8 14.6 -1.8 33.2 29.8 3.4
所以我目前的解决方案是手动遍历行并使用此方法设置值:
private static void SetDifference(DataRow dataRow, DataColumn numericColumn)
{
dynamic value1 = dataRow[numericColumn.Ordinal - 2];
dynamic value2 = dataRow[numericColumn.Ordinal - 1];
if (IsDbNullOrNullOrEmpty(value1) || IsDbNullOrNullOrEmpty(value2)) return;
//now find out the most decimals used and round to this value
string valueAsString = value1.ToString(CultureInfo.InvariantCulture);
int numOfDecimals = valueAsString.SkipWhile(c => c != '.').Skip(1).Count();
valueAsString = value2.ToString(CultureInfo.InvariantCulture);
numOfDecimals = System.Math.Max(numOfDecimals, valueAsString.SkipWhile(c => c != '.').Skip(1).Count());
double result = Convert.ToDouble(value1 - value2);
dataRow[numericColumn] = System.Math.Round(result, numOfDecimals);
}
但它感觉笨重,不利于性能。欢迎提出改进建议。
编辑:将列名从“int”更改为“num”以避免混淆
编辑:另外,我并不总是想四舍五入到小数点后一位。我可能有像 numA: 28 numB: 75.7999954 这样的数据,所以我想要一个差异:-47.7999954