22

我一直在琢磨如何在 PHP 中处理货币显示和数学运算,并且很长一段时间以来一直使用DECIMAL类型将其存储在 MySQL 中,并使用money_format()它来格式化以显示在网页上。然而,今天我看了一下实际的原型:

string money_format ( string $format , float $number )

我现在有点困惑。我被告知的是,避免为了钱而花车!但这里是基本的格式化函数(比如说快五倍),将输入转换为浮点数。number_format()做同样的事情。

所以我的问题是:

  1. 除非我处理的是小数美分或数万亿美元(我都没有处理),否则我是否应该关心显示存储(但从不计算)已被转换为浮动的货币?我会接近浮点不准确性改变我的数字的区域吗?

  2. 如果#1 的答案是我确实应该担心,那么为什么要money_format()这样构建呢?

4

1 回答 1

24

除非我处理的是小数美分或数万亿美元(我都没有处理),否则我是否应该关心显示和存储(但从不计算)已被转换为浮动的货币?我会接近浮点不准确性改变我的数字的区域吗?

出于纯粹的舍入/显示目的,只要绝对浮点表示误差小于 0.005 美元(因此舍入到最接近的分值是正确的),您就是安全的。

使用 IEEE 754 单精度,您的安全最高可达 131,072.00 美元。(131,072.01 美元表示为 131072.015625,四舍五入不正确。)

双精度(PHPfloat使用的)直到 70,368,744,177,664.01 美元(美分也有 0.015625)才会失败。你没有什么可担心的。

如果#1 的答案是我确实应该担心,那么为什么要这样构建 money_format() 呢?

应该采取什么类型?PHP 没有内置的十进制类型。许多其他语言也没有。

于 2011-01-12T01:54:20.577 回答