2017-01-19 3 views
7

В documentation указано, что $end диапазона включен. И в большинстве случаев это происходит, но когда оба значения $end и $step являются поплавками, последнее значение отсутствует. Почему это?Почему диапазон() не включен, если задан с поплавковым диапазоном и интервалом?

print_r(range(1, 13, 1)); 
print_r(range(1, 13, 0.1)); 
print_r(range(0.1, 1.3, 0.1)); 

Выход:

Array 
(
    [0] => 1 
    [1] => 2 
    // ... 
    [11] => 12 
    [12] => 13 
) 
Array 
(
    [0] => 0.1 
    [1] => 0.2 
    // ... 
    [119] => 12.9 
    [120] => 13 
) 
Array 
(
    [0] => 0.1 
    [1] => 0.2 
    // ... 
    [10] => 1.1 
    [11] => 1.2 
    // 12 => 1.3 is missing 
) 
+0

Интересно. Может быть, ошибка в PHP 7? –

+2

Плавающая точка является приблизительной. Когда вы увеличиваете значение на 0,1, вы не всегда будете точно ударять в конец. – Barmar

+1

Да, похоже, PHP7 https://3v4l.org/kp1Fv – AbraCadaver

ответ

3

Диапазон включительно; однако ваши предположения о суммировании чисел неверны.

0.1 не может быть представлен в двоичном формате с точной точностью. Когда вы используете его в расчете в php, вы фактически получите число, которое немного выше или ниже. Взгляните на следующий codepad:

http://codepad.org/MkoWgAA1

<?php 

$sum = 1.0 + 0.1 + 0.1; 

if ($sum > 1.2) { 
    print("1.2 > 1.2"); 
} else if ($sum < 1.2) { 
    print("1.2 < 1.2"); 
} else { 
    print("1.2 == 1.2"); 
} 

Выход:

1.2 > 1.2 
+0

Интересно, что это дает точно такие же результаты для всех версий, поддерживаемых [3v4l] (https://3v4l.org/QYgXR), в отличие от моего примера, который дает ожидаемый результат на версии 5.6-7.0.2 (а также HHVM), но поездки по точкам с плавающей запятой в версиях 7.0.3 - 7.1.1 – nCrazed

 Смежные вопросы

  • Нет связанных вопросов^_^