php 已弃用:从float到int的隐式转换会丢失精度

jjhzyzn0  于 9个月前  发布在  PHP
关注(0)|答案(3)|浏览(336)

我在玩从秒中获得小时和分钟的游戏,我们都看到了许多类似的问题,但我不确定什么解决方案是最好的

$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,但不知道如何正确转换它.

u2nhd7ah

u2nhd7ah1#

如果你想把你的浮点数转换成int,你可以使用一些函数,比如floorround等等。
在你的情况下,你正在寻找地板,所以你应该做:

<?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)

nwlls2ji

nwlls2ji2#

这里已经认可的答案并没有给出给予正确的结果。我们知道结果应该是:

int(1)
int(48)
int(50)

字符串
实际上是6530秒,因为:3600 + 2880 + 50 = 6530。
正确的计算方法是:

$seconds = 6530;

$modulusSeconds = $seconds % 60;
$minutes = intdiv($seconds, 60);
$modulusMinutes = $minutes % 60;
$hours = intdiv($minutes, 60);

var_dump($hours, $modulusMinutes, $modulusSeconds);


参见:https://3v4l.org/8JKQ9
然而,还有另一种计算方法:

$seconds = 6530;

echo gmdate("G i s", $seconds);


这是一个简单的例子。结果是:

zsohkypk

zsohkypk3#

使用floor(var)函数防止错误

相关问题