0

同じスキーマを持つ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

4

3 に答える 3

1

整数を格納する列がある場合は、整数型を使用してください。単精度浮動小数点型を使用した可能性があります。同じことが小数型にも当てはまります。10 進数の列タイプを使用すると、この丸めの問題は解消されます。

真の 10 進数型 (float、single、real、または double ではない) を使用すると、丸めの問題は発生しません。使用しているデータベースはわかりませんが、SQL-Server では正しい列の型はdecimal.


アップデート

列の型を変更できないため、このように要求された精度に丸めます

result = Math.Round((c1-c2) * 10)/10; // One decimal
result = Math.Round((c1-c2) * 100)/100; // Two decimals
result = Math.Round((c1-c2) * 1000)/1000; // Three decimals
Math.Round(3.141592654 * 10000)/10000 ===> 3.1416

--

アップデート

これを試してみてください。ほとんどの場合、うまく機能するはずです

decimal result = (decimal)col1 - (decimal)col2;

テスト

12.8f - 14.6f ===> -1.80000019

(10 進数)12.8f - (10 進数)14.6f ===> -1.8
于 2012-04-20T20:03:33.583 に答える
1

Olivier のコメントに基づいて、コードを次のように更新しました。

if(numericColumn.DataType == typeof(int))
{
    dataRow[numericColumn] = System.Math.Abs(value1 - value2);
}
else
{
    dataRow[numericColumn] = Convert.ToDecimal(value1) - Convert.ToDecimal(value2);
}

とてもきれいに見え、仕事を成し遂げます。助けてくれてありがとう。

于 2012-04-23T13:34:24.347 に答える
0

を使用してSQLクエリでこれを行う必要があります

ROUND(table1.IntCol 1 - table2.IntCol 2, 1)
于 2012-04-20T20:01:24.280 に答える