繁体   English   中英

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

[英]PHP floating point precision: Is var_dump secretly rounding and how can I debug precisley then?

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)

内部表示必须是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)

这意味着浮点数的内部表示在这里必须不同。 如果我想知道浮点数的确切值,那么我无法使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM