0

Или лыжи не едут или я идиот

<?php

for($i=0.04;$i<=0.06;$i+=0.01){$a[]=$i;}

var_dump($a);
var_dump(in_array("0.06",$a));


for($i=0.04;$i<0.07;$i+=0.01){$b[]=$i;}

var_dump($b);
var_dump(in_array("0.06",$b));

Результат

Успешно #stdin #stdout 0.02s 24456KB
array(2) {
  [0]=>
  float(0.04)
  [1]=>
  float(0.05)
}
bool(false)
array(3) {
  [0]=>
  float(0.04)
  [1]=>
  float(0.05)
  [2]=>
  float(0.06)
}
bool(false)

https://ideone.com/Mc06iZ

На сервере php 5.6, эффект тот-же.

UPD:

<?php

for($i=0.04;$i<=0.07;$i+=0.01){$a[]=$i;}

var_dump($a);
var_dump(in_array("0.06",$a));


for($i=0.04;$i<=0.07;$i+=0.01){$b[]=$i;}

var_dump($b);
var_dump(in_array("0.07",$b));

Результат

Успешно #stdin #stdout 0.02s 24108KB
array(4) {
  [0]=>
  float(0.04)
  [1]=>
  float(0.05)
  [2]=>
  float(0.06)
  [3]=>
  float(0.07)
}
bool(false)
array(4) {
  [0]=>
  float(0.04)
  [1]=>
  float(0.05)
  [2]=>
  float(0.06)
  [3]=>
  float(0.07)
}
bool(true)
oee
  • 1

1 Answers1

0

Видимо проблема в точности представления float https://www.php.net/manual/ru/language.types.float.php

Но это было очень неожиданно.

Комментарии приветствуются, может есть еще объяснения?

oee
  • 1
  • 1
    Что тут комментировать - так представляются вещественные числа в памяти – Alexander Chernin Feb 25 '20 at 10:08
  • 1
    https://ru.stackoverflow.com/questions/417453/%d0%92%d1%8b%d1%87%d0%b8%d1%81%d0%bb%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d1%87%d0%b8%d1%81%d0%bb%d0%b0%d1%85-%d1%81-%d0%bf%d0%bb%d0%b0%d0%b2%d0%b0%d1%8e%d1%89%d0%b5%d0%b9-%d1%82%d0%be%d1%87%d0%ba%d0%be%d0%b9-%d0%bd%d0%b5-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d1%8e%d1%82 – u_mulder Feb 25 '20 at 11:33
  • одно дело вычисление и другое - сравнение. Про вычисления знал, но не мог представить, что и со сравнением будет тоже самое – oee Feb 26 '20 at 10:09