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

时间:2021-07-19 03:52:05

标签: sql ms-access-2013 rounding-error

我对在查询中使用的舍入函数没有按预期工作感到非常困惑。 更新,我想我发现了下面列出的问题,但我不确定为什么它应该这样工作

基本上,我有一个类型为 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时,首先源数据[Amojnt]肯定改变了,如下图,然后当我修复源[金额] 到原来的,舍入功能完美地工作。事实上,它甚至可以处理奇怪的数据,因为它的数量太少以至于它被关闭了。

Single 数据类型是罪魁祸首吗?我使用它是因为我试图最小化数据存储,但显然 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

1 个答案:

答案 0 :(得分:0)

您不应该依赖本机 Round 来获取任何精确数据,因为它有很多问题。此外,它执行银行家的舍入,这可能不是您想要的。

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

相关问题