【发布时间】:2011-08-04 19:04:00
【问题描述】:
花了一个小时试图找出为什么 PHP 脚本给了我不正确的输出后,结果发现在一个特定情况下循环运行了一次迭代。
为了解释发生了什么:从 XML 属性中读取版本号(2 位,例如 1.5 或 2.0)并乘以 100。脚本稍后会在定义的版本号倍数范围内进行迭代。
事实证明,410 == 409,如果您将一个以 10 为增量的计数器与该值进行比较,这会产生一个有趣的惊喜。
这让我想到了我的问题:我是否从根本上理解了错误?当然,4.1、100 和 410 都应该可以很好地表示为 float 并且应该可以很好地转换为 int 而不会出现舍入错误?
但是,在我的系统上(使用 PHP 5.3.2 CLI,Zend Engine 2.3.0),以下测试用例
<?
$a = 100 * 4.1;
$b = (string) $a;
$c = (int) $a;
$d = (int)(string) $a;
var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
?>
输出:
float(410)
string(3) "410"
int(409)
int(410)
我现在正在做一个 (int)(string) 转换,它有效,但这是一种令人讨厌的 hack,它不漂亮而且感觉不太对。
是否有更好的(正确的、无破解的)解决方案来获得精确的结果?
【问题讨论】:
-
PHP typecasting float->int 的可能重复项
-
0.1 或 1/10 不能完全用二进制表示。就像十进制的 1/3。
标签: php floating-point type-conversion