php浮点数转换为字符串bug分析

发布时间:2020-12-16编辑:脚本学堂
有关php浮点数显示与转换成字符串的问题分析,php在处理浮点数时有非常不合理的做法,会有精度丢失,php内置的echo, var_dump, json_encode,字符串拼接等函数(指令)在显示浮点数时都有问题,导致精度丢失。

php中将浮点数(float)转成字符串,常用的方法隐藏着严重的bug。
因为, php在处理浮点数时有非常不合理的做法, 会有精度丢失。

经研究, 其实是php在显示浮点数时的问题, 也可以说是bug. php内置的echo, var_dump, json_encode, 字符串拼接等函数(指令)在显示浮点数时都有问题, 导致精度丢失.
 

复制代码 代码示例:
<?php
$a = 1315537636.338467;
printf("%f", $a); echo "n";
echo $a . "n";
echo $a; echo "n";
?>

输出结果:
1315537636.338467
1315537636.3385
1315537636.3385

用php最顺手的方法将浮点数转成字符串或者显示是不行的,(php实例 www.jb200.com)必须使用printf/sprintf将浮点数转成字符串.

第二部分,关于php将浮点数转为整数的问题
 

复制代码 代码示例:
<?php
echo (int) ( ( 0.1 + 0.7 ) *  10  );
?>
 

答案应该是7。

绝不要将未知的分数强制转换为integer。这样有时会导致不可预料的结果。

显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。
这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8 ,因为该结果内部的表示其实是类似 7.9 。

不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3 。

不要相信浮点数结果精确到了最后一位,不要比较两个浮点数是否相等。
如果确实需要更高的精度,应该使用任意精度数学函数或gmp函数。