提问人:m2dev 提问时间:10/5/2023 最后编辑:Progmanm2dev 更新时间:10/5/2023 访问量:88
升级PHP版本后不推荐使用的错误
Deprecated error after upgrade PHP Version
问:
我在PHP中使用了以下公式。它在 PHP 7.4 之前工作正常。现在我已经升级到PHP 8.1,它给出了错误。
<?php
echo ((float)13.5 + intdiv((float)13.5, (int)10) * (float)2.5 / (int)12);
我收到错误异常:弃用功能:从 float 13.5 到 int 的隐式转换失去精度
我该如何解决这个问题?此错误的原因是什么?
答:
1赞
Stalinko
10/5/2023
#1
问题是函数需要两个类型为:https://www.php.net/manual/ru/function.intdiv.phpintdiv()
int
但是你把变量作为第一个参数传递,这会导致隐式类型转换。float
在传递到函数之前,您应该以某种方式将浮点变量转换为。
这边:int
intdiv((int)13.5, 10)
或者这样:
intdiv(round(13.5), 10)
你指定的其余类型没有意义,因为 PHP 会以同样的方式自动计算它。
评论
2赞
IMSoP
10/5/2023
值得注意的是,返回的是一个浮点数而不是一个整数,所以仍然有一个隐式转换在进行,只是PHP知道是安全的。round()
0赞
m2dev
10/5/2023
@IMSoP 你能发布有效和安全的答案吗?
1赞
IMSoP
10/5/2023
@m2dev 什么是“有效”取决于你实际想要实现的目标;正如注释中所指出的,首先将浮点数传递给没有多大意义。本例中的第一个示例等同于您的旧代码,它将 13.5 截断为 13;这是否是你的意图,只有你能回答。intdiv
0赞
Stalinko
10/5/2023
很好的说明@IMSoP你是绝对正确的。从技术上讲,它仍然是 ,但现在它没有分数,因此 PHP 可以安全地将其转换为 。float
int
1赞
IMSoP
10/5/2023
@Stalinko是的,唯一重要的是,如果您处于模式,则在使用 3v4l.org/2A1el 后仍然会出现错误,因此需要将强制转换为 int 显式: 3v4l.org/K05WOstrict_types=1
round
2赞
IMSoP
10/5/2023
#2
用争论来称呼没有多大意义,而且可能真的给出了你想要的结果,也可能没有intdiv
float
去掉多余的演员,我们有
(13.5 + intdiv(13.5, 10) * 2.5 / 12)
被截断为整数,因此变为:13.5
(13.5 + intdiv(13, 10) * 2.5 / 12)
您可能希望它对值进行四舍五入,从而给出:
(13.5 + intdiv(14, 10) * 2.5 / 12)
对于 13.5 的例子,答案是一样的,但假设这实际上是一个变量,它会为 19.5 给出不同的例子,例如:
echo (13.5 + intdiv(19, 10) * 2.5 / 12); # 13.708333333333
echo (13.5 + intdiv(20, 10) * 2.5 / 12); # 13.916666666667
为了明确起见,您可以先在浮点数上使用 floor 或 round 函数,然后将其转换为 int(因为舍入的结果在技术上仍然是浮点数):
echo (13.5 + intdiv((int)floor(19.5), 10) * 2.5 / 12); # 13.708333333333
echo (13.5 + intdiv((int)round(19.5), 10) * 2.5 / 12); # 13.916666666667
评论
intdiv((int)(float)13.5, 10)
intdiv