python - 使用小数来赚钱如何避免python中的浮点问题?
问题描述
所以货币/货币在使用浮点数时有很多已知的数学问题。似乎在decimal
货币库中使用的 python 中,但根据python 文档,decimal
它是基于浮点的。那么这怎么没有同样的问题呢?
背景 很多货币库将其货币价值衡量为整数(所以美元的美分,而不是美元)。我们刚刚遇到了一个 python 应用程序的问题,将其货币表示为十进制,它进入 javascript,然后需要将其转换为整数以用于另一个服务。
10.05 / 100,变成 1050.0000...1,这当然不是整数。所以我当然想知道为什么 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(美分),所以对货币价值建模要合适得多。
推荐阅读
- inkscape - Inkscape:重置第一个节点
- java - Java lambda 方法和新对象
- sql - Postgres 查询 - 计算最繁忙的 1 小时时段
- ruby-on-rails - 返回用户结帐时加载已保存的记录,例如地址或邮政记录
- mysql - MySQL for Visual Studio,无法加载存储过程进行编辑
- css - 如果 Bootstrap CSS 已链接,则自定义 CSS 样式规则仅在添加到样式标签时适用
- ubuntu - Asp.Net Core Web API 应用程序:如何更改监听地址?
- javascript - 如何使用 PHP 从 mysql 中查询图像
- java - 多个局部变量与多个计算
- javascript - 在另一个文件 [HTML+JS] 的 html 标记中显示用户输入