2017-01-19 29 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

相關問題