【发布时间】:2016-09-13 20:59:03
【问题描述】:
在 PHP 中,我正在编写一个应用程序,该应用程序需要精确到货币小数点右侧的 2 位数字(例如:我关心 1.23 === 1.23,但没有更多的右侧数字)。
我知道浮点数通常被认为是不好的做法,因为基于从小数点右侧以 2 为基数转换为以 10 为基数的性质,它们的值不精确。但是,在我对处理货币值的最佳实践的研究中,我看到了一些论点,如果您需要大于整数值的精度,浮点数就不好。我显然不需要比整分值更高的精度。
那么我的问题是:
- 是否值得付出额外的努力将值存储为与
bcmath库一起使用的字符串? - 如果使用
bcmath库,我应该将 MySQL 数据库中的值存储为 MySQL 支持的字符串还是decimal?
谢谢!
【问题讨论】:
-
PS - 当然,在发布之前我已经对此进行了研究。有很多帖子都在讨论如何使用
bcmath及其对精度的价值,但我找不到一个专门讨论它是否需要只跟踪整数值。 -
使用整数美分而不是美元存储所有值,因此您可以将它们作为整数处理;并且只使用美元进行输入/输出
-
正要提出同样的建议,@MarkBaker。 ;-)
-
存储为整数美分并不是真正的额外工作,您需要的唯一额外工作是将美元/美分输入转换为美分,并将输出从美分装饰为美元/美分......使用 bcmath 将做更多的额外工作
-
一般来说,除了最苛刻的数学之外,使用浮点数已经绰绰有余了;你只需要非常小心比较和四舍五入;但处理货币的一般方法是使用将使用的最低整数面额存储(并执行任何数学运算)而不是使用浮点数
标签: php decimal precision bcmath