代码之家  ›  专栏  ›  技术社区  ›  Recursion

在python sqlite中如何处理财务计算中浮动类型的舍入错误?

  •  4
  • Recursion  · 技术社区  · 15 年前

    我正在创建一个财务应用程序,似乎我在sqlite中的浮动是浮动的。有时4.0是4.000009,而6.0是6.000006,诸如此类。我如何才能使这些更准确,而不影响我的财务计算?

    如果这很重要的话,值来自于python。不知道这些乱七八糟的数字来自哪个地区。

    6 回复  |  直到 9 年前
        1
  •  3
  •   10ToedSloth    15 年前

    使用sqlite时这是一个常见问题,因为它没有货币类型。
    正如S.Mark所说,你可以使用 Decimal 表示库。然而,sqlite 3只支持二进制浮点数(sqlite-type-real),因此您必须将十进制编码的浮点存储为文本或blob,或者转换为real(但之后您将返回64位二进制浮点)
    因此,考虑一下您需要表示的数字范围,以及您是否需要能够从数据库中执行计算。

    您最好使用支持数字类型的不同数据库,例如 MYSql , PostgreSQL ,请 Firebird

        2
  •  7
  •   YOU    15 年前
        3
  •  4
  •   Alex B    15 年前

    鉴于这是一个财务应用程序, 如果 您只有最多2或3个小数位的计算,您可以在内部将所有数据存储为整数,并仅将其转换为浮点表示。

    例如。

    6.00 -> 600
    4.35 -> 435
    
        4
  •  1
  •   John La Rooy    15 年前

    大多数人可能会为此使用decimal,但是如果它不映射到数据库类型,可能会影响性能。

    如果性能很重要,您可能需要考虑使用整数表示适当的货币单位-通常是美分或十分之一美分可以。

    在各种情况下,应该有关于如何对金额进行四舍五入的业务规则,并且应该有涵盖每个场景的测试。

        5
  •  1
  •   Bite code    15 年前

    使用 Decimal 操纵你的数字,然后使用 pickle 以文本形式保存并从sqlite加载它,因为它不处理数字类型。

    最后,使用 unitest doctest 对于财务操作,您希望确保所有代码都按照它在任何情况下应该执行的操作。你不能像对待社交网络那样去解决问题…

        6
  •  0
  •   psihodelia    15 年前

    你必须用十进制数。 小数可以精确表示。

    在十进制浮点中, 0.1 + 0.1 + 0.1 - 0.3 完全等于零。在二进制浮点中,结果是 5.5511151231257827e-017.

    所以,只需尝试十进制:

    import decimal