Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python-SQLite中如何处理金融计算中浮点类型的舍入错误?_Python_Sqlite_Floating Point - Fatal编程技术网

在Python-SQLite中如何处理金融计算中浮点类型的舍入错误?

在Python-SQLite中如何处理金融计算中浮点类型的舍入错误?,python,sqlite,floating-point,Python,Sqlite,Floating Point,我正在创建一个金融应用程序,似乎我在sqlite中的浮动正在浮动。有时候4.0会是4.000009,6.0会是6.00006,诸如此类。我如何才能使这些更准确,而不影响我的财务计算 如果重要的话,值来自Python。不确定这些乱七八糟的数字来自哪个地区 请使用十进制 鉴于这是一个金融应用程序,如果您的计算最多只有2或3位小数,那么您可以将所有数据作为整数存储在内部,并且仅将其转换为浮点数以用于表示 例如 你必须使用十进制数字。 十进制数字可以精确表示 在十进制浮点中,0.1+0.1+0.1-0.

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

如果重要的话,值来自Python。不确定这些乱七八糟的数字来自哪个地区

请使用十进制


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

例如


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

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

所以,试试十进制:

import decimal

这是使用SQLite时常见的问题,因为它没有货币类型。
正如S.Mark所说,您可以使用表示库。然而,SQLite 3只支持二进制浮点数(SQLite类型REAL),因此您必须将十进制编码的浮点存储为文本或BLOB或转换为REAL(但随后您将返回到64位二进制浮点)
因此,考虑需要表示的数字范围,以及是否需要在数据库内执行计算。
您最好使用另一个支持数字类型的数据库,例如大多数人可能会使用Decimal,但是如果这不映射到数据库类型,您可能会受到性能影响

如果性能很重要,你可能需要考虑使用整数来表示适当的货币单位——通常美分或十分之一可以。< /P> 应该有关于在各种情况下如何舍入金额的业务规则,并且您应该对每个场景进行测试。

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


最后,使用和,对于金融操作,您希望确保所有代码都执行它在任何情况下应该执行的操作。你不能像社交网络那样修复bug…

请给出一个简单的例子。哇,我不知道这个模块,但那太棒了!我必须记住这一点。我认为这是一个糟糕的建议,浮动600美元将被四舍五入到600.01美元。double为您购买了几个更重要的数字,但这仍然不是正确的做法-如果这段代码最终被金融软件用于数十亿美元的交易,该怎么办?这就是为什么我说您可以使用整数算术来代替(例如,4003,实际上是4.003,将在整数算术中精确表示),除非你是说别的?请详细说明。这不是一个好主意,因为国际转换率在点后有两位数以上。比如1欧元是655956法郎。显然,你可以通过暂时转换成浮点数来进行这样的计算,因为它们并不精确。但当一笔实际交易发生时,你不能得到一分钱的报酬,不是吗?
import decimal