0

そのため、Access で何年も実行されていたアプリケーションを、C#/Web アプリケーションに変換しようとしています。それはかなり正確な数学を扱っており、2 つの double 値の計算で問題が発生しました。

したがって、Access には次のコードがあります。

If Abs(varPartDataLocal(i, 0) - dblX_Star) < dblTemp Then

varPartDataLocal(i, 0) = 1.00000232 (データベースに文字列として格納) および dblX_Star = 1.00000226 (double に変換されて 2 で除算される 2 つの文字列値によって計算) であり、Access I でこれらの 2 つの値の Abs を取得すると、得る:

5.999999986E-08

一方、C# で同じコードを実行すると、次のようになります。

if (Math.Abs(Convert.ToDouble(varPartDataLocal[i, 0]) - dblX_Star) < dblTemp)

最後に:

6.0000000079441E-08

ただし、これを C# で行う場合 (基本的には上記と同じで、文字列から double に変換していません):

Math.Abs(1.00000232d - 1.00000226d)

それから私は得る

5.99999998573963E-08 (これは Access でこれを行う場合と同じです)

では、なぜ違いがあるのか​​という質問です。

4

1 に答える 1

0

以下のコードは、値の取得方法に関係なく同じ答えを与えることを考えると、あなたの問題は、dblX_Starあなたの質問には示されていないの計算にあることをお勧めします。

const double dbl1 = 1.00000232d;
const double dbl2 = 1.00000226d;
double rslt1 = dbl1 - dbl2;

const string str1 = "1.00000232";
const string str2 = "1.00000226";

double d1 = double.Parse(str1);
double d2 = double.Parse(str2);

double rslt2 = d1 - d2;

double dd1 = Convert.ToDouble(str1);
double dd2 = Convert.ToDouble(str2);
double rslt3 = dd1 - dd2;

Console.WriteLine("rslt1 = {0}", rslt1);
Console.WriteLine("rslt2 = {0}", rslt2);
Console.WriteLine("rslt3 = {0}", rslt3);

それからの出力は次のとおりです。

rslt1 = 5.99999998573963E-08
rslt2 = 5.99999998573963E-08
rslt3 = 5.99999998573963E-08
于 2013-03-18T02:08:14.197 に答える