我完全不知道为什么PHP的行为方式如下。
背景信息:我正在使用第三方支付网关库。出于某种原因,我的一些付款收取的费用少了1c!这对我们来说是个大问题。为了使事情更奇怪,它似乎只是某些特定的数量
查看他们的代码,我能够在一个简单的PHP脚本中重现它。
<?php
$val = 568.3 * 100;
echo $val;
echo "\n";
echo (float) ($val);
echo "\n";
echo (int) ($val);
echo "\n";
echo intval($val);
echo "\n";
?>
所有回声的预期输出为56830,但相反,当它的转换或使用intval时,它打印出56829(少1c)并且不使用类型转换或浮动工作。修复似乎只是没有使用int或intval转换,但我很好奇为什么会发生这种情况。
如果您输入56830,则所有打印都可以。可重复使用568.31 * 100但不是568.32 * 100.
任何人都可以帮我理解发生的事情吗?
编辑:float / floatval / no cast返回预期值。
以下作品,就在使用568.3时它会损失1美分! $ val = 5.3 * 100; $ val = 56888.3 * 100;
答案 0 :(得分:0)
$ val是float,其值为56829.999999 ......转换为int时会向下舍入。
来自手册
http://www.php.net/manual/en/language.types.integer.php
从浮点数¶
从float转换为整数时,数字将被舍入 零。
如果浮点数超出整数的边界(通常为+/- 2.15e + 9 在32位平台上= 2 ^ 31,在Windows以外的64位平台上+/- 9.22e + 18 = 2 ^ 63),结果是未定义的,因为浮点数没有 有足够的精度来给出精确的整数结果。没有警告,没有 发生这种情况时,甚至会发出通知!
答案 1 :(得分:0)
FuzzyTree的答案解释了浮点运算的问题。您可以在intval
之前使用round
修复此问题。
<?php
$val = 568.3 * 100;
echo $val;
echo "\n";
echo (float) ($val);
echo "\n";
echo (int) (round($val));
echo "\n";
echo intval(round($val));
echo "\n";
?>
输出:
56830
56830
56830
56830