【问题标题】:PHP Division Float Value IssuePHP除法浮点值问题
【发布时间】:2014-09-25 12:20:24
【问题描述】:

当我尝试获取余数时,它给出了无效值。我试图得到剩下的两个十进制值,我得到了

3.4694469519536E-18

我的价值观是

 $x=0.1; $y=0.005;

我尝试了以下方法:

echo $ed = fmod(0.1,0.005);  OutPut:3.4694469519536E-18
echo $ed = ((floatval(0.1)) % (floatval(0.005)));

但是得到

Warning: Division by zero

但现实是 0.1 将在 20 次中除以 0.005。即0.1/0.005 = 20

当我使用10%1 = 0 时,相同的函数返回正确的值。

我怎样才能得到确切的余数。 (我在 JQuery 中没有遇到同样的问题 :))

检查解决方法:PHP Division Float Value WorkAround

【问题讨论】:

  • 3.47e-18 是零。您有基本的浮点问题。
  • @NiettheDarkAbsol 我无法得到你的观点?

标签: php math decimal


【解决方案1】:

% 运算符仅适用于整数,因此它会将浮点数截断为整数并尝试执行 0 % 0,这会导致除以零。

您唯一可以使用的是fmod()。您在这里面临的问题是典型的浮点不精度(该值“几乎”为零)。我会考虑忽略小于 10^-15 的值。在 PHP 中没有真正的替代方案。

你可以尝试做真正的除法,然后,运气好的话,不精确的痕迹就会消失。 (如round(0.1 / 0.005) === 0.1 / 0.005

【讨论】:

  • 所以基本上,你会做abs(x) < 1e-15,而不是x == 0
  • @NiettheDarkAbsol 是的,你必须在使用浮点数时做这样的事情。
  • @bwoebi 会发生什么,如果我在两边都乘以 100 并检查剩下的?这是一个很好的做法。即 ((0.1*100)%(0.005*100)) ?
  • @TomPHP 你有 0.005,所以你至少需要 200。问题是,你可以相乘(你需要选择一个总是合适的数字,但情况可能并非如此...... ),但即使那样你也可能会遇到问题……
  • @TomPHP 用 C 也不能。你总是可以编写自己的十进制数实现(这是 Javascript 内置的),但通常不行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 2011-05-06
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多