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

And*_*rew 21 php floating-point currency floating-accuracy money-format

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

string money_format ( string $format , float $number )
Run Code Online (Sandbox Code Playgroud)

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

所以我的问题是:

  1. 除非我处理的是分数美分或数万亿美元(而且我都没有处理过),我是否应该关注显示存储(但从不进行数学计算)货币被抛到浮点数?我是否会接近浮动点不准确的区域改变我的数字?

  2. 如果对#1的回答是我确实应该关注,那么为什么这样money_format()构建呢?

dan*_*n04 22

除非我处理的是分数美分或数万亿美元(而且我都没有处理过),我是否应该关注显示和存储(但从不进行数学计算)货币被抛到浮点数?我是否会接近浮动点不准确的区域改变我的数字?

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

使用IEEE 754单精度,您最高可达131,072.00美元.($ 131,072.01表示为131072.015625,错误地向上舍入.)

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

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

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

这在"为什么浮点值如此多产?"中讨论.

  • 你说“不会失败直到……”但是像复利这样的东西呢?小错误可能会累积起来。 (2认同)