PHP 中的 float 不准确是众所周知的 ( http://php.net/manual/de/language.types.float.php ),但是经过以下实验后我有点不满意:
var_dump((2.30 * 100)); // float(230)
var_dump(round(2.30 * 100)); // float(230)
var_dump(ceil(2.30 * 100)); // float(230)
var_dump(intval(2.30 * 100)); // int(229)
var_dump((int)(2.30 * 100)); // int(229)
var_dump(floor(2.30 * 100)); // float(229)
内部表示必须类似于 229.999998。
var_dump((2.30 * -100)); // float(-230)
var_dump(round(2.30 * -100)); // float(-230)
var_dump(ceil(2.30 * -100)); // float(-229)
var_dump(intval(2.30 * -100)); // int(-229)
var_dump((int)(2.30 * -100)); // int(-229)
var_dump(floor(2.30 * -100)); // float(-230)
内部表示必须类似于 -229.999998。
据我所知 - 整数转换和 intval 函数只是简单地删除了点后面的所有内容。很高兴知道。
但是 var_dump() 给了我 230 的值,尽管根据这些结果实际值必须不同。
现在看看这个:
$a = 230.0;
var_dump($a); // float(230)
var_dump((int) $a); // int(230)
也就是说这里 float 的内部表示肯定是不一样的。如果我想知道 float 的确切值,那么我不能像我习惯的那样使用 var_dump 进行调试,对吗?如何调试精确的浮点值?
最佳答案
你可以尝试使用number_format它不会是完美的,因为您必须提供小数位数,但应该有所帮助。
echo number_format(8-6.4, 50);
1.59999999999999964472863211994990706443786621093750
echo number_format(2.3*100, 50);
229.99999999999997157829056959599256515502929687500000
编辑:由于小数位数不同(这也取决于所使用的系统),以下可能有用 - 确定获取完整数字并删除尾随零:
echo rtrim(number_format(1.0/3.432, 100),0);
0.29137529137529138978379705804400146007537841796875
关于PHP 浮点精度 : Is var_dump secretly rounding and how can I debug precisley then?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49981651/