【问题标题】:If dealing with money in a float is bad, then why does money_format() do it?如果在浮动中处理钱很糟糕,那么为什么 money_format() 会这样做呢?
【发布时间】:2011-06-07 10:08:32
【问题描述】:

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

string money_format ( string $format , float $number )

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

所以我的问题是:

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

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

【问题讨论】:

  • 大部分 int->float 转换的危险来自于对这些浮点数进行数学运算。 number_format() 只是进行“漂亮打印”类型转换,因此浮动化过程创建的任何奇怪的重复小数都不太可能影响结果。
  • PHP 并不是“最佳实践”的缩影。
  • @OP 我刚刚注意到你说正在存储。请不要将钱存为花车。使用某种固定精度。
  • 我没有,我将它们存储在 MySQL DECIMAL 字段中,该字段不是浮点字段。我的考虑是,假设我有 $i,并将其转换为浮点数(通过手动转换或 number_format() 的输出或其他方式),然后将其存储在数据库中。它将被存储DECIMAL,所以我并不担心,所以我承认我的说法有点奇怪。我更担心通过在系统周围将其转换为浮动来对其进行哪些更改。也就是说,我把它拿出来,我把它转换成float,我把它存回去……会不会不一样?

标签: php floating-point currency floating-accuracy money-format


【解决方案1】:

除非我正在处理分数 美分或数万亿美元(而我 两者都不处理),我应该 完全关心展示和 存储(但从不做数学) 被铸造成浮动货币的货币? 我会不会靠近 浮点数不准确 改变我的数字?

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

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

双精度(PHP 的 float 使用)直到 $70,368,744,177,664.01(美分也有 0.015625)才会失败。您无需担心。

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

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

【讨论】:

  • String 听起来是个不错的主意。尽管它开始听起来越来越像,对于纯粹的代表性问题而不是数学问题,我应该对浮点数感到非常满意。被接受是因为它减轻了我的恐惧,并为教育链接 +1。 :)
  • 您说“直到...”才会失败,但是诸如复利之类的事情呢?小错误可能会累加。
  • OP 询问的是显示和存储,而不是数学。
  • 链接丢失。
  • @Nick:这个问题被删除为“离题”。如果您有足够多的声望点,您仍然可以看到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2015-09-25
  • 2012-02-03
相关资源
最近更新 更多