喜悦国际村 » PHP高级编程 » PHP的重大BUG,大家编程要小心了

页: [1]
liyaping2008-3-26 08:47 AM
PHP的重大BUG,大家编程要小心了

浮点数转换会有bug,误差居然会出现个位数差异

<?

$m=117113+193405.46;
var_dump($m);
$m=$m*100;
var_dump($m);
$mz=(int)$m;
var_dump($mz);

?>
执行结果:
float(310518.46) float(31051846) int(31051845)


测试环境:redhat as5    PHP Version 5.2.1

[[i] 本帖最后由 liyaping 于 2008-3-26 04:48 PM 编辑 [/i]]

kuye31312008-3-26 09:40 AM
$mz=(int)$m;

flyinghail2008-3-26 03:19 PM
这个在手册中就提醒了,对于浮点数类型你看到的数字和实际php内的数字是不同的
例如官方手册中的例子0.1+0.7,如果intval出来结果就是0.7
(0.1 + 0.7) == 0.8的结果false
所以php用浮点数计算要小心

如果要转换成整数可以先用number_format或者转换成字符串再转换成整数

敌敌畏2008-3-27 12:52 AM
PHP有高精度运算的函数库,

liyaping2008-3-27 01:43 AM
[quote]原帖由 [i]flyinghail[/i] 于 2008-3-26 11:19 PM 发表
这个在手册中就提醒了,对于浮点数类型你看到的数字和实际php内的数字是不同的
例如官方手册中的例子0.1+0.7,如果intval出来结果就是0.7
(0.1 + 0.7) == 0.8的结果false
所以php用浮点数计算要小心


如果要 ... [/quote]

这点是知道的,所有语言对于浮点数的比较应该是 a-b<最小精度  方式比较,
但是作为一个强制类型转换而不是取整函数,应该判断一下最小精度,否则就会引起歧义,为什么转成字符串再转成int就可以了

[[i] 本帖最后由 liyaping 于 2008-3-27 09:45 AM 编辑 [/i]]


查看完整版本: PHP的重大BUG,大家编程要小心了


Powered by Discuz! Archiver 6.1.0  © 2001-2006 Comsenz Inc.
Processed in 0.005894 second(s), 2 queries