【问题标题】:Implicit conversion from float (number) to int loses precision从 float(数字)到 int 的隐式转换会丢失精度
【发布时间】:2022-09-20 16:03:55
【问题描述】:

我曾经在 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 文档中找到或理解为什么现在会发生这种情况

【问题讨论】:

    标签: php


    【解决方案1】:

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

    隐式:

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

    通过函数显式:

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

    或通过演员表:

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

    【讨论】:

      【解决方案2】:
      // 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;
      

      【讨论】:

      • 您需要在答案中添加支持信息,因为读者不仅对答案本身感兴趣,而且对为什么它是正确答案的原因感兴趣。
      • 对不起,我想努力。
      猜你喜欢
      • 1970-01-01
      • 2015-07-27
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      相关资源
      最近更新 更多