计算两个不同于Access和c#的双字段

本文关键字:字段 Access 不同于 两个 计算 | 更新日期: 2023-09-27 18:04:17

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

在Access中我有如下代码:

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

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

5.999999986 e-08

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

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

最后:

6.0000000079441 e-08

然而,如果我在c#中这样做(基本上与上面相同,我只是没有将它从字符串转换为双精度):

Math.Abs(1.00000232d - 1.00000226d)

则得到

5.99999998573963E-08(这与我在Access中这样做时相同)

那么问题是为什么会有差异呢?

计算两个不同于Access和c#的双字段

考虑到无论我如何获得值,下面的代码给出相同的答案,我建议你的问题在于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