代码之家  ›  专栏  ›  技术社区  ›  TheWebs

不推荐:从float到int的隐式转换会丢失精度

php
  •  0
  • TheWebs  · 技术社区  · 2 年前

    我在玩分秒必争的游戏,我们都看到了很多类似的问题,但我不确定什么解决方案是最好的

    $seconds = 6530;
    
    $secs = $seconds % 60;
    $hrs = $seconds / 60;
    $mins = $hrs % 60; // Causing the issue
    $hrs = $hrs / 60;
    
    var_dump($hrs, $mins, $secs);
    

    这是代码,它给了我:

    Deprecated: Implicit conversion from float 108.83333333333333 to int loses precision 
    float(1.8138888888888889)
    int(48)
    int(50)
    

    我理解这个错误,这不是问题所在,问题在于如何解决它

    $mins = (int) ($hrs % 60);
    
    and 
    
    $mins = intval($hrs % 60);
    
    as well as
    
    $mins = (int) round($hrs % 60);
    

    但我也有同样的问题。

    以下是沙盒供参考: https://onlinephp.io/c/b5b45

    解决这个问题的正确方法是什么?我确实想要这个 int ,但不确定如何正确转换。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Nati.v    2 年前

    如果你想把浮点值int到int,你可以使用这样的函数 floor round

    在您的情况下,您正在寻找地板,因此您应该:

    <?php
    
    
    $seconds = 6530;
    
    $secs = $seconds % 60;
    $hrs = $seconds / 60;
    $hrs = floor($hrs);
    $mins = $hrs % 60;
    $hrs = $hrs / 60;
    
    var_dump($hrs, $mins, $secs);
    

    这就是给予:

    float(1.8)
    int(48)
    int(50)