如何在python中使用十进制来避免浮点问题?

2024-03-29 12:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,当使用浮点时,货币/货币有很多问题。在python中decimal似乎用于货币库,但根据python docsdecimal是基于浮点的。那么这怎么会没有同样的问题呢

上下文 许多货币库以整数(美元的美分,而不是美元)来度量货币价值。我们刚刚遇到了一个python应用程序的问题,该应用程序将其货币表示为十进制,并将其转换为javascript,然后需要将其转换为整数以用于另一个服务

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


Tags: 应用程序docs度量货币整数javascript路线金钱
3条回答

您将二进制浮点与十进制浮点混淆。从module documentation开始:

The decimal module provides support for fast correctly-rounded decimal floating point arithmetic.

[...]

  • Decimal numbers can be represented exactly. In contrast, numbers like 1.1 and 2.2 do not have exact representations in binary floating point

(我的粗体强调)

浮点方面是指指数的可变性;数字12300000可以表示为123,十进制指数为5(10**5)。floatdecimal都使用浮点表示。但是float加上许多二进制分数(1/2+1/4+1/8+1/16+…),而使得它们不适合以二进制分数表示货币,因此不能精确地建模1/100或1/10,因为货币值往往使用很多

{a2}you链接还向您介绍Java{a3}。Python的decimal本质上是相同的东西;当BigDecimal文档讨论值由任意精度整数未标度值和32位整数标度组成时,标度基本上是浮点的位置

因为decimal可以精确地表示货币值的百分之一(美分),所以它更适合对货币值进行建模

十进制避免了二进制浮点的一些问题,但不是全部,甚至可能不是大部分

实际问题不是浮点而是数字格式。没有数字格式可以表示所有实数,甚至所有有理数,因此没有数字格式可以处理我们想要对数字执行的所有操作

货币通常用货币单位的小数表示。例如,美元和许多其他货币的“分”是一美元的百分之一。十进制格式可以精确表示1/100th。无法使用二进制格式。因此,使用十进制格式,您可以:

  • 精确表示十进制货币单位(在格式范围内)
  • 精确地(在格式范围内)添加和减去货币的十进制金额
  • 将十进制货币单位与整数精确相乘(在格式范围内)

但是,在尝试以下操作时会出现问题:

  • 求平均数或除以除十(或二或五)幂以外的数。例如,如果一家杂货店想以三美元一美元的价格出售一种产品,那就没有办法代表它⅓ 完全是十进制格式
  • 将数字与小数相乘几次以上。每次乘法将增加小数点后的位数。例如,无法使用典型的十进制格式精确计算一年的每月复利
  • 任何复杂的(一般意义上的,不是数学上的)操作,比如考虑货币时间价值、股票市场期权评估等可能涉及的指数运算

对于如何进行数值计算,没有通用的解决方案。利用教科书、课程和研究论文研究数值计算及其误差。所以你不能仅仅通过选择一种格式来解决数值问题。了解您使用的任何格式、使用时出现的错误、如何处理这些错误以及需要实现的结果都很重要

十进制类型允许十进制浮点而不是二进制浮点。你所指的问题类别与后者有关

相关问题 更多 >