【问题标题】:PHP Math DiscrepancyPHP 数学差异
【发布时间】:2019-11-22 02:39:34
【问题描述】:

这是一些简单的数学运算,并不完全加起来。

990 / 7670 = 0.12907431

假设我要收取 1% 的费用,我从 1000 开始。

同样的数学适用于(1000 - 1% = 990)

首先:
990 / 7670 = 0.12907431

然后使用我的原始号码 (+1%):
1000 / 0.12907431 = 7747.4750785

终于抵消了从 1000 减少的 1%。我将 7670 增加了 1%:
7670 * 1.01 = 7746.7

为什么最后两个值有 0.01% 的差异?这个 PHP 对小数的处理很糟糕吗?

我看不出我在哪里失去了它,我觉得数学是正确的。我知道 PHP 有时会出现舍入问题,我想知道它是否就这么简单,或者我是否错过了一个 obv 数学问题。

【问题讨论】:

  • 对浮点的进一步说明——因为计算机本身是 2 进制的,所以 10 进制的小数必须是近似的。就像你不能精确地写出十进制的 1/3 一样,以 10 为底的小数也不能总是以 2 为底精确存储。因此,需要四舍五入。如果您需要浮点数的精度,请考虑使用 bcmath 扩展。

标签: php math decimal rounding


【解决方案1】:

990 + 1% 不等于 1000。它等于 999.9。

990 * 1.01 = 999.9

话虽如此 - 你永远不能依赖像这样的不同浮点计算来评估准确正确答案。 PHP 与其他语言一样,没有“舍入问题”,而是使用与实数不同的浮点数。

【讨论】:

  • 啊,当然不能这样反转。所以你说的是 7670 在这种情况下相当于 990。将 1% 添加到 7670 = 7746.7 (999.9)。但是 7747.4750785 - 1% 等于 7670。这就是我所缺少的差异。如果我将百分比从 1% 增加到 10%。差距变得更大了。我认为这解决了我的问题。我只需要弄清楚如何编码,而不知道原始数字(1000 或 990)
  • (990 / (100 - 1%)) * 100 = 1000 。这是我的解决方案。
  • (7670 / (100 - 1)) * 100 = 7747.47
猜你喜欢
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 2012-05-28
相关资源
最近更新 更多