PHP将float转换为int返回不同的值

Der*_*ola 6 php casting

当我在PHP(v5.5.9)中执行以下代码时,会发生意外情况:

$valueAsCents = 54780 / 100 * 100;
var_dump($valueAsCents);
var_dump((int) $valueAsCents);
Run Code Online (Sandbox Code Playgroud)

这回来了

float 54780
int 54779
Run Code Online (Sandbox Code Playgroud)

所以显然没有小数的浮点值不等于int值.关于这里发生了什么的任何想法?

Ste*_* E. 4

当你除以 $valueAsCents = 54780 / 100 时,它就变成了一个浮点数,由于它们的存储方式,它在数字形式上并不总是准确的。在我的测试中,我得到
547.7999999999999545252649113535881042480468750000

乘以 100 则为
54779.9999999999927240423858165740966796870000

当 PHP 转换为 int 时,它总是向下舍入。
从浮点转换为整数时,数字将四舍五入为零。

这就是为什么int值为54779

此外,浮点类型的 PHP 手册还包含一个提示,即浮点数可能不会达到您的预期。

此外,可以精确表示为以 10 为基数的浮点数的有理数(例如 0.1 或 0.7),没有精确表示为以 2 为基数的浮点数(无论尾数的大小如何,在内部使用)。因此,它们无法在不损失少量精度的情况下转换为内部二进制对应项。这可能会导致令人困惑的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期的 8,因为内部表示类似于 7.9999999999999991118...

  • 感谢您的清晰解释。如果有人想知道,解决方法是先对结果进行“四舍五入”,然后再转换为“int”。 (3认同)