go - 使用整数作为小数系数而不是浮点数对于货币应用来说是一个好主意吗?
问题描述
我的应用程序需要小数乘以货币值。
例如,$65.50 × 0.55 hours = $36.025
(四舍五入为$36.03
)。
我知道float 不应该用来表示 money,所以我将我所有的货币价值存储为美分。$65.50
上式中存储为6550
(整数)。
对于小数系数,我的问题是它0.55
没有 32 位浮点表示。在上面的用例中,我的应用程序需要准确计算的特定值的示例也是0.55 hours == 33 minutes
如此。0.55
的浮点表示0.550000012
是不够的,因为用户不会明白附加值是0.000000012
从哪里来的。我不能简单地调用舍入函数,0.550000012
因为它会舍入到整数。
乘法解决方案
为了解决这个问题,我的第一个想法是将所有数量存储为整数并乘以 × 1000。因此0.55
用户输入的内容在存储时将变为550
(整数)。所有计算都将在没有浮点数的情况下进行,然后在将结果呈现给用户时简单地除以 1000(整数除法,而不是浮点数)。
我意识到这将永久限制我精确到小数点后 3 位。如果我决定 3 足以满足我的应用程序的生命周期,那么这种方法是否有意义?
如果我使用整数除法,是否存在潜在的舍入问题?
这个过程有名字吗?编辑:如@SergGr 所示,这是定点算术。
有更好的方法吗?
编辑:
我应该澄清一下,这不是特定时间的。它适用于通用数量,例如1.256 pounds of flour
、1 sofa
或0.25 hours
(想想发票)。
我在这里尝试复制的是 Postgresextra_float_digits = 0
功能的更精确版本,如果用户输入0.55
(float32),数据库存储0.550000012
但当查询结果返回时0.55
,这似乎正是用户键入的内容。
我愿意将此应用程序的精度限制在小数点后 3 位(这是商业问题,而不是科学),所以这就是让我考虑这种× 1000
方法的原因。
我正在使用 Go 编程语言,但我对通用的跨语言解决方案感兴趣。
解决方案
存储结果的另一种解决方案是使用值的有理形式。你可以用两个相等的整数值来解释这个数字p/q
,使得两者p
都是q
整数。因此,您可以对数字有更高的精度,并以两个整数的格式对有理数进行一些数学运算。
推荐阅读
- r - kable 降价报告中的所有表格
- excel - 如何修复在没有按钮但不使用按钮时执行的 VBA 回归代码
- javascript - 在 GoDaddy 服务器上使用 javascript 写入文本文件
- json - 正确查询此 JSON 对象
- asp.net - 可以从本地主机发布到服务器数据库,但是当发布到服务器时,我得到“错误:52 - 无法找到本地数据库运行时安装。”
- python - Django 问卷,每个答案有几个分数类别
- spring-mvc - 在spring-mvc中创建时配置kafka主题保留策略?
- canvas - 如何在图表旁边的画布上放置额外的文本(不使用 HTML)?
- c - 在 C 中创建 2(或 3?)维字符串数组
- javascript - 包含 require() 语句的外部 JavaScript 库无法加载到 Angular 8 应用程序中