PHP对int的价格正在下降一分钱

时间:2014-06-29 02:22:22

标签: php casting int

我完全不知道为什么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;

2 个答案:

答案 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