MSAccess 2013查询中的奇数舍入行为



我很困惑在查询中使用舍入函数时没有按预期工作更新,我想我发现了下面列出的问题,但不确定为什么它应该以这种方式工作

基本上,我有一个类型为Single的值[Amount],通常有5位数的可用精度,但在某些查询中,我希望将其四舍五入到两位数,其他时候保持为5。我发现,即使[Amount]只有两个小数点的实际数据,查询也会返回12或13,就像它的反向工作一样;展开";它的数字略低。。。请参见下文。我甚至尝试使用一个整数舍入函数,先将值乘以100000,然后取整数,再除以100000,我看到了类似的行为:这几乎就像Access以不同的精度存储数据,而不是实际呈现的

以前从未见过这种情况,不知道如何纠正这种情况并按预期进行。顺便说一句,如果我使用相同的查询并从中生成一个表,那么这12位数字的值就会被放入新表中。

任何想法都值得赞赏,因为我正试图在某些地方将我的数学修正为5位数,这种不精确性使我无法知道实际值应该是多少。我在最初的2位数之上放了几个样本值,这样你就可以看到这种行为有多混乱。

SQL:

SELECT amount, Round([amount],2) AS Round_2_Digits, Round([amount],5) AS Round_5_digits, Int([amount]*100000)/100000 AS Integer_5 digits from FCS
amount     Round_2_Digits     Round_5_digits    Integer_5 digits
95.88       95.879997253418     95.879997253418     95.87999
95.88001    95.879997253418     95.880012512207     95.88001
95.881      95.879997253418     95.8809967041016    95.88099
95.889      95.8899993896484    95.8889999389648    95.88899

更新:在写这篇文章的时候,我想知道Single数据类型是否是问题所在,当我将其更改为Double时,首先源数据[Amoujnt]肯定发生了变化,如下所示,然后当我将源[Amount]固定为原始数据时,舍入函数工作得很好。事实上,即使是奇怪的数据,它也能工作,因为它的数量很小,所以它关闭了

那么,单一数据类型是罪魁祸首吗?我之所以使用它,是因为我试图最大限度地减少数据存储,但显然Double是可行的。有人知道为什么吗?谢谢

以下是我将数据类型更改为double:后的更新查询

amount         Round_2_Digits   Round_5_digits  Integer_5 digits
95.879997253418     95.88       95.88           95.87999
95.880012512207     95.88       95.88001        95.88001
95.8809967041016    95.88       95.881          95.88099
95.8889999389648    95.89       95.889          95.88899

这是我将原始数据重置为后的查询

amount     Round_2_Digits   Round_5_digits  Integer_5 digits
95.88       95.88            95.88          95.88
95.88001    95.88            95.88001       95.88001
95.881      95.88            95.881         95.881
95.889      95.89            95.889         95.889

您永远不应该依赖本机Round来获取任何精度数据,因为它非常有缺陷。此外,它执行银行家取整,这可能不是您想要的。

对于您的情况,您可以使用VBA.Round.中的RoundMid函数

最新更新