从 float(数字)到 int 的隐式转换会丢失精度
P粉449281068
P粉449281068 2023-10-21 18:33:55
[PHP讨论组]

我在 php 8.1 之前曾经使用过这个公式

<?php
$number = 0;
echo log10(abs($number)) / 3 | 0;

echo PHP_EOL;

$number = 100;
echo log10(abs($number)) / 3 | 0;

echo PHP_EOL;
    
$number = 1100;
echo log10(abs($number)) / 3 | 0;

echo PHP_EOL;
    
$number = 10000000;
echo log10(abs($number)) / 3 | 0;
?>

它工作得很好,但现在升级后我不断收到这些错误

Deprecated: Implicit conversion from float -INF to int loses precision

Deprecated: Implicit conversion from float 0.6666666666666666 to int loses precision

Deprecated: Implicit conversion from float 1.0137975617194084 to int loses precision

Deprecated: Implicit conversion from float 2.3333333333333335 to int loses precision

我无法从 8.1 文档中找到或理解为什么现在会发生这种情况

P粉449281068
P粉449281068

全部回复(2)
P粉043295337
// Implicit variant
$number= "2";
$calc = 2 + $number;

// Cast variant
$number = "2";
$calc= 2 + (int) $number;

// Explicit variant
$number = "2";
$calc = 2 + intval($number);

// Everything is good variant ^^
$number = 2;
$calc = 2 + $number;
P粉211600174

当您通过 | 运算符执行按位 OR 运算时,您将获得到整数的隐式转换。这是一种……奇怪的……转换为整数的方式。要避免警告,只需显式转换即可。

隐式:

echo log10(abs($number)) / 3 | 0;

显式通过函数:

echo intval(log10(abs($number)) / 3);

或者通过演员表:

echo (int) (log10(abs($number)) / 3);
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号