当我在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值.关于这里发生了什么的任何想法?
当你除以 $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...