首页 > 解决方案 > 使用小数来赚钱如何避免python中的浮点问题?

问题描述

所以货币/货币在使用浮点数时有很多已知的数学问题。似乎在decimal货币库中使用的 python 中,但根据python 文档decimal它是基于浮点的。那么这怎么没有同样的问题呢?

背景 很多货币库将其货币价值衡量为整数(所以美元的美分,而不是美元)。我们刚刚遇到了一个 python 应用程序的问题,将其货币表示为十进制,它进入 javascript,然后需要将其转换为整数以用于另一个服务。

10.05 / 100,变成 1050.0000...1,这当然不是整数。所以我当然想知道为什么 python 选择了这条路线,因为我看到的大多数建议都建议将钱视为整数。

标签: python

解决方案


您将二进制浮点数与十进制浮点数混淆了。从模块文档

十进制模块提供对快速正确舍入的十进制浮点运算的支持。

[...]

  • 十进制数可以精确表示。相反,像 1.1 和 2.2 这样的数字在二进制浮点中没有精确的表示

(粗体强调我的)。

浮点方面是指指数的可变性;该数字12300000可以表示为 123,十进制指数为 5 (10 ** 5)。两者都float使用decimal浮点表示。但是float加起来一些二进制分数(1/2 + 1/4 + 1/8 + 1/16 + ...),使得它们不适合表示货币,因为二进制分数不能精确地模拟 1/100 或 1 /10ths,哪些货币价值往往使用很多。

您链接的有关货币浮点问题的DZone 文章还向您介绍了 Javajava.math.BigDecimal。Python的decimal本质上是一样的;在BigDecimal文档中讨论的值由任意精度整数未缩放值和 32 位整数比例组成,比例本质上是浮点的位置。

因为decimal可以准确地表示货币价值的 1/100(美分),所以对货币价值建模要合适得多。


推荐阅读