如何在Python SQLite中处理浮动类型的舍入错误以进行财务计算?

时间:2009-11-26 02:55:34

标签: python sqlite floating-point

我正在创建一个财务应用程序,似乎我在sqlite中的浮动正在浮动。有时4.0将是4.000009,6.0将是6.00006,这样的事情。如何使这些更精确,而不影响我的财务计算?

如果重要的话,值来自Python。不确定混乱的数字来自哪个区域。

6 个答案:

答案 0 :(得分:7)

答案 1 :(得分:4)

由于这是一个财务应用程序,如果你只能计算最多2或3个小数位,你可以在内部将所有数据存储为整数,并且只将它们转换为float用于演示目的

E.g。

6.00 -> 600
4.35 -> 435

答案 2 :(得分:3)

这是使用SQLite的常见问题,因为它没有货币类型 正如S.Mark所说,你可以使用Decimal表示库。但是,SQLite 3只支持二进制浮点数(sqlite类型REAL),所以你必须将Decimal编码的float存储为TEXT或BLOB或转换为REAL(但是你将回到64位二进制浮点数)
因此,请考虑您需要表示的数字范围以及是否需要能够在数据库中执行计算。

您可能最好使用支持NUMERIC类型的其他数据库,例如MYSqlPostgreSQLFirebird

答案 3 :(得分:1)

大多数人可能会使用Decimal,但如果这不会映射到数据库类型,则可能会影响性能。

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

应该有关于如何在各种情况下舍入金额的业务规则,并且您应该对每个方案进行测试。

答案 4 :(得分:1)

使用Decimal来操纵您的数字,然后使用pickle保存它并将其作为文本从SQLite加载,因为它不处理数字类型。

最后,使用unitestdoctest,对于财务操作,您希望确保所有代码都能完成它在任何环境中所做的事情。你无法修复类似于社交网络的错误......

答案 5 :(得分:0)

您必须使用十进制数字。 十进制数字可以准确表示。

在十进制浮点数中,0.1 + 0.1 + 0.1 - 0.3正好等于零。在二进制浮点数中,结果为5.5511151231257827e-017.

所以,试试小数:

import decimal