为什么 MS Access 以科学记数法返回一些结果?

Why is MS Access returning some results in scientific notation?

我有两个字段,都在 table 属性中将大小设置为双倍。当我从另一个字段中减去一个字段时,当我在单元格中单击时,一些结果显示为科学记数法,而其他结果仅显示小数位的常规标准格式。

两个字段中的数据均已使用 Round([Field01],2) 和 Round([Filed2],2) 更新,因此字段中的数字不应超过 2 位小数。

举个例子: 字段 1 = 7.01 字段 2 = 7.00 但是,当我从 Field2 中减去 Field1 时,访问显示显示 0.01,但是当我单击结果时,它显示 -9.99999999999979E-03。所以当然,当我尝试过滤所有具有 0.01 的结果时,查询返回空,因为它认为结果是 -9.99999999999979E-03.

更奇怪的是,如果 Field1 = 1.02 和 Field2 = 1.00,结果是 0.02,当我点击结果时,显示仍然显示 0.02,我可以过滤所有等于 0.02 的结果。

为什么 MS Access 会以不同方式处理同一查询中的数字?为什么它以科学记数法显示而不是过滤?

感谢您的支持。

“两个字段中的数据都已使用 Round([Field01],2) 和 Round([Filed2],2) 更新,因此字段中的数字不应超过 2 位小数。”您可以使用数字字段作为数据类型,而不是四舍五入(我认为这是科学记数法的原因),然后在字段大小下选择双精度,然后在小数位下选择 2.

在Access(甚至Excel)中使用这个简单的代码,运行它!

Public Sub TestAdd()
   Dim MyNumber      As Single
   Dim I             As Integer
  For I = 1 To 10
      MyNumber = MyNumber + 1.01
      Debug.Print MyNumber
  Next I

End Sub

这是上面的输出:

 1.01
 2.02
 3.03
 4.04
 5.05
 6.06
 7.070001
 8.080001
 9.090001
 10.1

您可以看到在仅进行了 7 次加法运算后就发生了舍入!

请注意,在仅仅 7 个简单的小添加之后,Access 现在会吐出错误的数字并出现舍入错误!

更神奇?上面的代码 运行 与 Excel!

中的相同

好的,我确定我现在引起了你的注意!

如果我还记得,第一天也是计算科学领域的第一天 class?使用浮点数时,计算机不会存储精确数字。

那么,整个商业社区使用 Excel 或 Access,或者实际上您的桌面计算器怎么可能不会崩溃?

您的意思是 Access 无法将 7 个简单的小数相加而不会出现错误?

那我还怎么发工资呢?

这里的基本概念和所有您需要知道的是,计算机仅将实数(浮动)存储为近似值。

并且整数值被精确存储。

所以,这里有几种方法,事实上,如果您编写任何需要处理金钱价值的商业软件?并且不会出现舍入误差?

那么你最好选择我们所谓的某种“缩放”整数。在幕后,计算机不使用浮点数,而是使用整数值,并且还有一个“小数”位置。

事实上,在很多较老的业务 BASIC 语言中,还是其他?我们经常不得不自己进行缩放。 (因此,我们会选择大整数格式)。其实这个“缩放”功能在Access中还是存在的!!! (您会在格式选项中看到它)。

所以,这里有两个选择。如果您不想出现“微小”的舍入错误,请使用“货币”数据类型。这对你来说可能不够,也可能不够,因为它只允许最多 4 位小数。但在大多数情况下,它应该足够了。如果您需要“更多”小数位,则可以将这些值乘以 1000,然后在完成计算后除以 1000。

但是,尝试将列类型更改为货币,应该可以。 (这种类型的数据也是您的桌面计算器的工作方式 - 因此您不会看到有趣的舍入错误(在大多数情况下)。

但是,今天的第一条规则是什么?第一门计算机课程?

计算机不会存储浮点数的精确数字 - 它们是近似值,并且会出现舍入误差。现在,如果您真的对 table 使用双精度数,那么我认为这些舍入错误不应该出现 - 因为您有“这么多小数位”可用。

但是,我会尝试使用货币数据类型 - 它是一个缩放整数,或者所谓的压缩十进制。

您还可以选择在 Access 中使用压缩十进制,它最多支持 28 位数字,并且您可以设置“比例”(小数点位置)。但是,由于您不能在 VBA 中声明小数类型,因此我建议在 table 中(以及在 VBA 代码中,使用货币数据类型)。

如果您需要超过 4 个小数点,则考虑在代码中缩放货币,或者可能在那个时候,您考虑在 table 中使用压缩十进制类型,但在 [=66] 中使用值=] 将必须使用“变体”类型,如果在代码中使用并从相关 table(s) 中分配值,它们将正确采用数据列设置。

不用说,您第一天开始与计算机打交道,那第一天除了成为“最终用户”之外还有什么?嗯,这是你今天的第一课!