当我在 PHP (v5.5.9) 中执行以下代码时,发生了意外情况:
$valueAsCents = 54780 / 100 * 100;
var_dump($valueAsCents);
var_dump((int) $valueAsCents);
此返回
float 54780
int 54779
很明显,没有小数的 float 值不等于 int 值。对这里发生的事情有什么想法吗?
当你除以 $valueAsCents = 54780 / 100 时,它就变成了一个浮点数,由于它们的存储方式,它在数字形式上并不总是准确的。在我的测试中我得到了
547.7999999999999545252649113535881042480468750000
乘以 100 就是这样
54779.9999999999927240423858165740966796870000
当 PHP 转换为 int 时,它总是向下舍入。
从浮点转换为整数时,数字将向零舍入。
这就是为什么int值为54779
此外,Float 类型的 PHP 手册还包含一个提示,即浮点数可能不会达到您的预期。
此外,可以精确表示为以 10 为基数的浮点数的有理数(例如 0.1 或 0.7),不能精确表示为以 2 为基数的浮点数,无论尾数的大小如何,都在内部使用。因此,它们无法在不损失少量精度的情况下转换为内部二进制对应项。这可能会导致令人困惑的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期的 8,因为内部表示类似于 7.9999999999999991118....
在这个网站(https://floating-point-gui.de/)有各种语言的浮点问题的解决方案,其中包括 PHP https://floating-point-gui.de/languages /php/。