3

私は、非常に古い古典的な ASP/VBScript/Access Web サイトを「現在の」サイトに変換する作業を引き受けました。ご想像のとおり、ほとんどの作業は簡単にやり直すことができましたが、文書化されていない一連の計算に依存するレポート ページがあるため、彼のコード/数式を使用する必要がありますが、それらを C# に移動する必要があります。 .

完全な開示のために、Access データベースを問題なく SQL Server にインポートしました。EntityFramewok PowerTools (Code First) を使用して、新しいデータベースをリバース エンジニアリングし、.edmx ファイルを作成しました。EntityFramework が私のために .edmx を作成したとき、C# クラスの nullable Doubles (Double?) としてデータベース内の float であるフィールドを定義していることに気付きました。 float を nullable double に変換する方法は?

私が疑わしいと思うもう 1 つの場所は、丸み付けです。明らかに、丸めに関する数学は変更されていませんが、VBScript と C# には、丸めの方法に既知の違いがあるのではないかと思います。

したがって、これらの行は VBScript で

varA1=oDataRs("boundData")
varB1i=varA1*3.0689
varB1=round(varB1i,3)

これがC#になります

var newVal = Math.Round(boundData.Value * 3.0689,3);

データベースから出てきたときにそれを操作するだけです。そうしないとDoubleを乗算できないため、.Valueを使用する必要がありますか? そしてダブル。

値は非常に近いですが、非常に重要なデータで約 .036 ずれており、その理由がわかりません。

4

1 に答える 1

6

実際、.NETVB はどちらも Banker's Rounding アルゴリズムを使用するため、MidpointRounding.AwayFromZero を指定しない限り、一貫した結果が得られるはずです。

非常に興味深い質問は、Access データベースのソース データが浮動小数点数なのか通貨列なのかということです。通貨の場合は、2 進数ではなく 10 進数を使用する必要があります。乗算される数値の大きさが十分に異なる場合、小さな違いが生じる可能性があります。

特に重要なデータについて、boundData の値は?

于 2012-11-30T21:39:51.050 に答える