$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   


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

<?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 函数。  
 



本文链接二维码可以保存在本地:保存

| 浏览 (3533) | (0) | (0) | | 2017-01-12 13:40:49 |


相关文章

  1. PHP ErrorException A non well formed numeric value encountered
  2. curl curl_setopt 参数的含义
  3. PHP中CURL方法curl_setopt()函数的一些参数
  4. thinkphp分页类循环处理 $i 变量作为当前页码 直至终止
  5. ThinkPHP 跨模块调用操作方法(A方法与R方法)