我想更新foreach范围之外的变量,并在其中的条件中再次使用它,但condition中的变量与初始值保持不变。它在外部得到更新,但是内部的条件仍然使用旧值进行比较。条件中使用的变量里面的变量也如何更新?
$total = 5.00000008;
for($i = 0; $i < count($values); $i++) {
if($total == $values[$i]){
$total += 0.00000001;
}
}
我指的是if条件中的$ total变量,它不会被更新。
答案 0 :(得分:1)
@NanThiyagan在评论中写道:
”您的问题尚不清楚。但是您的代码可以正常运行 eval.in/1050113“
检查输出。它说5.0000001。这可能会提示您php自动执行某些操作以舍入您的值。
阅读:http://php.net/manual/en/language.types.float.php 并注意以下部分:
“所以永远不要相信浮点数结果到最后一位,并且不要 直接比较浮点数是否相等。“
在本文中,他们以隐式精度解决问题:https://www.leaseweb.com/labs/2013/06/the-php-floating-point-precision-is-wrong-by-default/
赞:
ini_set('precision', 17);
echo "0.1 + 0.2 = ". ( 0.1 + 0.2 ) ."\n";
$true = 0.1 + 0.2 == 0.3 ? "Equal" : "Not equal";
echo "0.1 + 0.2 = 0.3 => $true\n";
答案 1 :(得分:1)
我认为您可能不完全了解循环中发生的事情。
每次条件为 true 时,变量$total
都会被更新。并且条件变量$total
也被更新。
这是一个例子,您可以看到它的发生:
$values = [5.00000008, 5.00000009, 5.00000007];
$total = 5.00000008;
for($i = 0; $i < count($values); $i++) {
echo ((string) __line__ . ' => ' . (string) $total . " (current total)\n");
if($total === $values[$i]){
echo ((string) __line__ . ' => ' . (string) $total . " (before increment)\n");
$total += 0.00000001;
echo ((string) __line__ . ' => ' . (string) $total . " (after increment)\n");
}
}
这是经过测试的代码:https://3v4l.org/EJkNG
答案 2 :(得分:1)
我指的是if条件中的$ total变量,它不会被更新。
当然会更新。
只需在循环内回显$ total即可找出结果。
<?php
$values = [5.00000007, 5.00000008, 5.00000009];
$total = 5.00000008;
for ($i = 0; $i < count($values); $i++) {
if ($total == $values[$i]) {
$total += 0.00000001;
}
echo $total . "\n";
}
输出:
5.00000008
5.00000009
5.0000001
自己看看