gpt4 book ai didi

python - 用 Python 做会计的最佳实践

转载 作者:太空狗 更新时间:2023-10-30 00:52:19 30 4
gpt4 key购买 nike

我正在编写一个 web2py 应用程序,它需要在不损失精度的情况下对美元金额求和。我意识到我需要为此使用 Decimals,但我发现自己必须用以下代码包装从数据库中获得的每个数字:

十进制(str(myval))

在我疯狂地将它添加到我的所有代码之前,有没有更好的方法?我是 Python 的新手,所以我很可能忽略了一些明显的东西。

编辑:我的数据库是 MS SQL Server,我将金额存储在 SQL Server money 字段中(我相信实现类似于 Decimal,即整数数学,不是 float )。

我正在通过 web2py 框架(使用 pyodbc 进行 SQL Server 连接)连接到数据库。我相信 web2py 对小数类型有一些支持。例如,我的 web2py 字段定义如下:Field('Amount','decimal(19,4)') 但是,当我使用 web2py 的 .executesql 方法,它将值作为 float 而不是 Decimal 返回。

编辑:这似乎是 FreeTDS 和 MS SQL Server 的问题。正如 Massimo 在评论中所述,web2py 正确支持这一点并返回 Decimal(如果可以的话)。事实证明,这只是我的生产环境 (Linux) 中的一个问题。我正在使用 FreeTDS 驱动程序连接到 MS SQL,它似乎正在将 MS SQL 货币类型转换为 Python float 。

我认为 Alex Martelli 的回答指向了正确的方向。有没有人有使用 FreeTDS、MS SQL 和 python 的经验?我认为这可能值得提出自己的问题,所以我将转移讨论...(此处发布新问题:FreeTDS translating MS SQL money type to python float, not Decimal)

更新:FreeTDS 中实际上存在一个错误。这是 fixed in the CVS head截至 2010 年 8 月 4 日的 FreeTDS。

最佳答案

首先,将所有数字以十进制形式保存在数据库中——你没有提到你使用的是什么数据库引擎,但每个引擎都支持这样的功能,例如 here是 MySQL 的 DECIMAL 类型文档。我希望您已经这样做了,但如果您还没有这样做,仍然架构更改的痛苦是值得的。

然后,您需要确保与数据库之间的类型转换与数据库的小数位与 Python 的相匹配。不幸的是,没有跨 DB-API 实现的标准方法,但大多数都提供了一种方法;例如,对于 MySQLDB,您需要在 connect 中传递一个 conv= 参数,称为“类型转换器字典”——默认是 MySQLdb 的副本.converters.conversions 但当然你可以丰富它来用小数做正确的事情。如果您告诉我们您正在使用哪个数据库,以及您更喜欢哪个 DB-API 连接器包,我们可能会就此主题为您提供更详细的帮助。

编辑:@unutbu 在评论中评论说当前的 MySQLdb 转换器已经正确地转换了小数,因此,除非您坚持使用非常旧的 MySQLdb 版本,否则您应该没问题,只要正如您所做的那样,正确地将所有数字保留为数据库中的十进制(耶!)。

关于python - 用 Python 做会计的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3364699/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com