Bla*_*bam 6 php floating-point precision casting
PHP 中的浮点数不准确是众所周知的(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)
Run Code Online (Sandbox Code Playgroud)
内部表示必须类似于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)
Run Code Online (Sandbox Code Playgroud)
内部表示必须类似于-229.999998
.
好的,据我所知 - 整数转换以及 intval 函数只是简单地切割了点后面的所有内容。很高兴知道。
然而,var_dump()
给我一个 230 的值,尽管根据这些结果,实际值必须不同。
现在看看这个:
$a = 230.0;
var_dump($a); // float(230)
var_dump((int) $a); // int(230)
Run Code Online (Sandbox Code Playgroud)
这意味着浮点数的内部表示在这里必须不同。如果我想知道浮点数的确切值,因此我不能var_dump
像以前那样调试,对吗?如何调试精确的浮点值?
您可以尝试使用number_format它并不完美,因为您必须提供小数位数,但应该有所帮助。
echo number_format(8-6.4, 50);
Run Code Online (Sandbox Code Playgroud)
1.59999999999999964472863211994990706443786621093750
echo number_format(2.3*100, 50);
Run Code Online (Sandbox Code Playgroud)
229.99999999999997157829056959599256515502929687500000
编辑:由于小数位数不同(这也取决于所使用的系统),以下内容可能有用 - 确保获取完整数字并删除尾随零:
echo rtrim(number_format(1.0/3.432, 100),0);
Run Code Online (Sandbox Code Playgroud)
0.29137529137529138978379705804400146007537841796875