我目前正在将包含货币值的数据集导入Access数据库。虽然我已经读过我应该使用十进制数据类型作为货币,但如果将值四舍五入到最接近的美元,我是否可以不使用double来减少文件大小?
据我所知,使用double for currency的问题是由于四舍五入,但我不会直接对数据进行计算。任何计算都将由应用程序/用户完成。
类似地,由于数据是固定长度的,因此一些十进制值由整数表示。例如,某些字段可能包含值12345,但实际值为12.345。这需要我导入数据然后更新值;在上面的例子中除以1000。
以这种方式使用double会导致舍入错误吗?
答案 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时,它只是在计算机中使用“真实”格式时才是近似值。
因此,计算机不能也不会将实数存储到精确的精度。结果会出现舍入错误。
对于工资单或与业务应用程序和资金有关的任何事情,您必须使用缩放的整数,否则您的表和会计甚至报告都不会累加,您会遇到舍入错误。
除非您存储数百万行数据,否则我无法想到存储空间方面的任何好处。更糟糕的是,如果您将此数据导出到其他系统,那么导出“真实”数字可能会在导出时引入各种工件甚至指数 - 使用货币 - 您在所看到和拥有的内容中是安全的。