【问题标题】:rand(0,$var) returns zero when $var is really big当 $var 非常大时,rand(0,$var) 返回零
【发布时间】:2014-03-15 13:31:58
【问题描述】:

当我运行下面的代码时:

<?
echo rand(0, 0xfffffffffffffbff); 
echo rand(0, 0xfffffffffffffc00);
echo rand(0, $something_bigger_than_0xfffffffffffffbff);

我得到了类似的东西:

-828
0
0

(第二个和第三个数字总是为零)

mt_rand() 具有相同的行为。

那么,为什么是零?

【问题讨论】:

标签: php


【解决方案1】:

rand() 函数接受两个整数作为其参数。整数的最大范围通常为 2^32。提供的参数,当转换为整数时,将大于此,从而导致整数溢出。

这实际上是记录在案的行为。来自PHP manual documentation

从浮点数转换为整数时,数字会四舍五入 趋近于零。

如果浮点数超出整数的边界(通常为 +/- 2.15e+9 = 32 位平台上的 2^31 和 +/- 9.22e+18 = 64 位平台上的 2^63),结果未定义,因为浮点数没有 足够的精度来给出精确的整数结果。没有警告,甚至没有 届时将发出通知!

【讨论】:

    【解决方案2】:

    您需要将整数值传递给rand(),因为上面的$a = 0xfffffffffffffbff;double 但不是整数值,双精度值0xfffffffffffffbff 将被转换为整数,最终您将得到一个零。

    供您理解的插图。

    <?php
    $a = 0xfffffffffffffbff;
    
    echo gettype($a); //"prints" double
    
    if(is_int($a))
    {
        echo "Yes";
    }
    else
    {
        echo "Nope.. casting that to int results in..".intval($a)."<br>"; 
    }
    
    echo rand(0, $a);
    

    OUTPUT :

    double
    Nope.. casting that to int results in..0
    0
    

    【讨论】:

    • 您能否更详细地说明0xfffffffffffffbff 是如何以及为什么不是整数值,实际上是什么,以及它如何导致零?
    • @delnan,添加了一个例子。
    • @delnan: var_dump 是你的朋友:eval.in/120662 - 它是float(1.844674407371E+19)
    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2013-04-12
    • 2018-09-26
    • 2020-02-20
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多