【问题标题】:MSAccess 2013 odd rounding behavior in queriesMSAccess 2013 查询中的奇数舍入行为
【发布时间】:2023-03-11 16:28:01
【问题描述】:

我对在查询中使用时无法按预期工作的舍入函数感到很困惑。 更新,我想我找到了问题,如下所列,但不知道为什么它应该这样工作

基本上,我有一个类型为 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 是要走的路。有谁知道为什么?谢谢!

这是我将数据类型更改为双精度后的更新查询:

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

【问题讨论】:

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


    【解决方案1】:

    您永远不应该依赖本机 Round 来获取任何精度数据,因为它非常有问题。此外,它还执行 Banker's Rounding,这可能不是您想要的。

    对于您的情况,您可以使用位于VBA.RoundRoundMid 函数。

    【讨论】:

    • 感谢您的信息,对 roundmid 函数很感兴趣,必须检查一下。但它似乎更像是 Single 数据类型的函数而不是舍入函数。如果数据是 Double 类型,则工作正常,只是使用 Single 的相同查询和其他代码的奇怪数据。
    • Single 应始终小心使用。但是这样的小心并不能使 Round 正常工作。它仅对非关键舍入有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多