Wah*_*nto 1 php floating-point
$a = 100;
$b = 3;
$test1 = $a/ $b;
$test2 = 33.333333333333; // $test2 == $test1
var_dump(($test1 * $b)); // float(100)
var_dump(($test2 * $b)); // float(99.999999999999)
Run Code Online (Sandbox Code Playgroud)
对此有何解释?
100/3结果33.3-repeating.
没有小数点值可以显示它.在数学中,这样的数字通常在重复值上用小点表示.(虽然我不知道如何在这个代码框中显示).
请参阅此Wiki文章,了解它们在各个地方的表示方式以及我在此处给出的更为详细的解释.
但是,从这篇文章中可以看到摘要的片段:
在算术中,重复十进制是表示有理数的一种方式.因此,数字的十进制表示称为重复十进制(或重复十进制),如果在某些时刻它变为周期性的,即,如果有一些有限的数字序列无限重复.例如,十进制表示1/3 = 0.3333333 ...或0.3(表示为"0.3重复"或"0.3重复")在小数点之后变为周期性,无限地重复单个数字序列"3".一个稍微复杂的例子是3227/555 = 5.8144144144 ...,其中十进制表示在小数点后的第二个数字处成为周期性的,无限地重复数字"144"的序列.
现在,这是你的问题,这里的症结,而且要记住(其他两个答案指出)是花车惊人innacurate在计算和比较的方面.快速搜索这个网站将揭示一小群人在浮动的内部表示方面存在问题 - 主要是在进行比较时导致意外行为.
慢慢阅读浮点数据类型的PHP警告- 我再次复制了重要的位:
另外,可以精确表示为基数10中的浮点数的有理数,如0.1或0.7,不具有精确表示为基数2中的浮点数,其在内部使用,无论尾数的大小.因此,它们不能在没有很小精度损失的情况下转换为它们的内部二进制对应物.这可能会导致令人困惑的结果:例如,floor((0.1 + 0.7)*10)通常会返回7而不是预期的8,因为内部表示将类似于7.9999999999999991118 ....