php数值类型转换字符串转整形 造成数据损失
$str = "21.08";
var_dump($str*10000);
var_dump (intval($str*10000));
var_dump((0.1+0.7) * 10 );
var_dump((int) ( (0.1+0.7) * 10 )) ; // 显示 7
结果:
float(210800)
int(210799)
float(8)
int(7)
原因分析:
那么从浮点型转换
当从浮点数转换成整数时,将向下取整。
如果浮点数超出了整数范围(32 位平台下通常为 +/- 2.15e+9 = 2^31,64 位平台下通常为 +/- 9.22e+18 = 2^63),则结果为未定义,因为没有足够的精度给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!
Warning
<?php echo (int) ( (0.1+0.7) * 10 ); // 显示 7! ?>
参见关于浮点数精度的警告,如下:
浮点数的字长和平台相关,尽管通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式)。
Warning
浮点数的精度
浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。
此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118...。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,使用任意精度数学函数或者 gmp 函数。
本文链接二维码可以保存在本地:保存
http://shixiangcun.cc/index.php?c=index&id=54&m=articleDetailInfo
分类 ThinkPHP | 浏览 (4043) | 赞 (0) | 踩 (0) | | 2017-01-12 13:40:49 |
相关文章
- PHP ErrorException A non well formed numeric value encountered
- curl curl_setopt 参数的含义
- PHP中CURL方法curl_setopt()函数的一些参数
- thinkphp分页类循环处理 $i 变量作为当前页码 直至终止
- ThinkPHP 跨模块调用操作方法(A方法与R方法)