2017-01-19 28 views
7

documentation指出该范围的$end是包含性的。在大多数情况下都是这种情况,但是当$end$step都是浮点数时,最后的值就会丢失。这是为什么?为什么range()不包含在浮点范围和间隔时间内?

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中使用它时,你会得到一个更高或更低的数字。在下面的键盘看看:

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

相关问题