如果在浮存金中处理金钱是不好的,那么为什么money_format()这样做呢?

我一直在纠结于如何处理PHP中的货币显示和数学,并且长期以来一直在使用该类型将其存储在MySQL中,并用于格式化它以在网页上显示。但是,今天我看了一下实际的原型:DECIMALmoney_format()

string money_format ( string $format , float $number )

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

所以我的问题是:

  1. 除非我正在处理小数美分或数万亿美元(而我两者都不处理),否则我是否应该担心显示存储(但从未对)被投射到浮点币的货币进行计算?我是否会接近浮点不准确改变我的数字的区域?

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


答案 1

除非我正在处理小数美分或数万亿美元(而我两者都不处理),否则我是否应该担心显示和存储(但从未对)被投射到浮点币的货币进行计算?我是否会接近浮点不准确改变我的数字的区域?

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

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

双精度(PHP使用)直到$ 70,368,744,177,664.01(其中也有.015625美分)才会失败。你没什么可担心的。float

如果#1的答案是我确实应该担心,那么为什么money_format()以这种方式构建?

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


答案 2

推荐