我一直在摸着这个非常奇怪的问题。我在PHP中做了一些计算,最终结果是一个数字。这是一个整数,但由于计算完成,PHP认为这是一个浮点数。但是,当我将它作为一个整数进行类型转换时,它会被神奇地减去一个整数。如在1.整数整数下来。我真的很茫然。试试吧。
<?php
$number_of_rows = 10;
$number_of_columns = 19;
$active = array();
$tile = 160;
$column = $tile/$number_of_columns; // 8.42105263158
$rounded_down = floor($column); // 8
$column = $column-$rounded_down; // 0.42105263158
$column = $column*$number_of_columns; // 8
var_dump($column); // 8 -> that is great
var_dump((int)$column); // 7 -> WTF?!!!
?>
Linux 64位上的PHP 7.0.12。
答案 0 :(得分:2)
有关说明,请参阅Warning in PHP manual。
关于精度和floor()
示例的摘录:
浮点数的精度有限。虽然它取决于系统,但PHP通常使用IEEE 754双精度格式,由于舍入的顺序为1.11e-16,因此会产生最大的相对误差。非基本算术运算可能会产生更大的误差,当然,当复合多个运算时,必须考虑误差传播。
此外,基本10中的浮点数精确表示的有理数,如0.1或0.7,没有精确表示为基数2中的浮点数,无论尾数的大小如何,它都在内部使用。因此,它们不能在没有很小精度损失的情况下转换为它们的内部二进制对应物。这可能会导致令人困惑的结果:例如, floor((0.1 + 0.7)* 10)通常会返回7而不是预期的8 ,因为内部表示将类似于7.9999999999999991118 ....