PHP 浮点精度:var_dump 是否秘密舍入,然后如何调试 precisley?

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像以前那样调试,对吗?如何调试精确的浮点值?

mle*_*eko 4

您可以尝试使用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