php浮点数精度问题,php生成随机浮点数

发布时间:2019-07-25编辑:脚本学堂
有关php浮点数精确的问题,以及php生成随机浮点数的小例子,不要相信浮点数结果精确到了最后一位,不要比较两个浮点数是否相等,不了解的朋友可以参考下。

有关php浮点数的精度问题
简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。
 

floor(( 0.1 + 0.7 ) * 10)   返回 7 而不是8,
(int)(( 0.1 + 0.7 ) * 10)  返回7而不是8.

因为该结果内部的表示其实是类似 7.9。
 
结论:
不要相信浮点数结果精确到了最后一位,不要比较两个浮点数是否相等。
决不要将未知的分数强制转换为Int。
 
(int)round( 0.1 + 0.7 ) * 10) 这样似乎就安全了。
在有大量乘除或者是中间值为float类型时,为了数值精度还是使用BC math函数了。

这里介绍下php生成随机的浮点数的方法。

php编程中,有用到一些非常小的浮点数,以前遇到概率问题时都是用mt_rand取一个范围的整数,当遇到概率差距很大时,也只是把随机数的上限位数加大,这样如果数值有调整的话,代码也需要调整,不利于程序扩展,并且会影响到随机的精度问题,建议生成一个0-1之间的随机浮点数。

例子:
 

function randomFloat($min = 0, $max = 1) { 
    return $min + mt_rand() / mt_getrandmax() * ($max - $min); 

 
var_dump(randomFloat()); 
var_dump(randomFloat(2, 20));