同じスキーマを持つ2つのデータテーブルの数値データを比較する必要があります。たとえば、次のようなデータを含む2つのテーブル
PKColumn | numCol | DecimalCol
マージ後はこのようになります
PKColumn | numCol 1 | numCol 2 | numCol Diff | DecimalCol 1 | DecimalCol 2 | DecimalCol Diff
最初は、式col1-col2としてdiff列を作成しましたが、最終的には異常な値になる可能性があります
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」に変更しました
編集:また、私は常に小数点以下1桁に丸めたいとは限りません。numA:28 numB:75.7999954のようなデータがある可能性があるので、次の差分が必要です:-47.7999954