0

因此,我正在将一个在 Access 中运行多年的应用程序转换为 C#/web 应用程序。它处理一些非常精确的数学,我遇到了计算两个双精度值的问题。

所以在Access中我有以下代码:

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

其中 varPartDataLocal(i, 0) = 1.00000232 (作为字符串存储在数据库中)和 dblX_Star = 1.00000226 (由转换为双精度并除以 2 的两个字符串值计算)以及当我在 Access I 中获得这两个值的 Abs 时得到:

5.999999986E-08

而当我在 C# 中执行相同的代码时:

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

我结束了我们:

6.0000000079441E-08

但是,如果我在 C# 中执行此操作(基本上与上面相同,我只是不将其从字符串转换为双精度):

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 回答