在Access数据库中存储舍入的货币值时是十进制还是双精度?

时间:2014-01-30 01:37:37

标签: ms-access double decimal

我目前正在将包含货币值的数据集导入Access数据库。虽然我已经读过我应该使用十进制数据类型作为货币,但如果将值四舍五入到最接近的美元,我是否可以不使用double来减少文件大小?

据我所知,使用double for currency的问题是由于四舍五入,但我不会直接对数据进行计算。任何计算都将由应用程序/用户完成。

类似地,由于数据是固定长度的,因此一些十进制值由整数表示。例如,某些字段可能包含值12345,但实际值为12.345。这需要我导入数据然后更新值;在上面的例子中除以1000。

以这种方式使用double会导致舍入错误吗?

1 个答案:

答案 0 :(得分:4)

是的,分歧可以并且将会引入舍入错误。

您希望将“币种”用于任何类型的商业软件。实际上,如果您没有货币数据类型,则使用SCALED整数(缩放结果)。你这样存储

$ 123.52

作为

1235200

(假设小数点后4位)

当然,理由是计算机中的“真实”数字只是一种表示,只是近似的 - 它们可以进行四舍五入。

这是简单的代码:

  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

  Here is the actual output of the above:

   1.01
   2.02
   3.03
   4.04
   5.05
   6.06
   7.070001
   8.080001
   9.090001
   10.1

想象一下上面的内容 - 在刚刚添加了7个SIMPLE和SILLY后,我们已经得到了错误的答案。即使在Excel中,VBA也会执行相同的操作。如上所述,我们使用0.01,但它只是近似的! (所以当我们假设这个值是1/100时,它只是在计算机中使用“真实”格式时才是近似值。

因此,计算机不能也不会将实数存储到精确的精度。结果会出现舍入错误。

对于工资单或与业务应用程序和资金有关的任何事情,您必须使用缩放的整数,否则您的表和会计甚至报告都不会累加,您会遇到舍入错误。

除非您存储数百万行数据,否则我无法想到存储空间方面的任何好处。更糟糕的是,如果您将此数据导出到其他系统,那么导出“真实”数字可能会在导出时引入各种工件甚至指数 - 使用货币 - 您在所看到和拥有的内容中是安全的。