为什么在给定浮点范围和间隔时 range() 不包含在内?
Why is range() not inclusive when given with float range and interval?
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.1 无法用精确的二进制表示。当您在 php 的计算中使用它时,您实际上会得到一个略高或略低的数字。看看下面的键盘:
<?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
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.1 无法用精确的二进制表示。当您在 php 的计算中使用它时,您实际上会得到一个略高或略低的数字。看看下面的键盘:
<?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