搜尋

首頁  >  問答  >  主體

從 float(數字)到 int 的隱式轉換會失去精確度

我曾經在 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粉449281068P粉449281068442 天前921

全部回覆(2)我來回復

  • P粉043295337

    P粉0432953372023-10-22 12:07:10

    // 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;

    回覆
    0
  • P粉211600174

    P粉2116001742023-10-22 10:41:26

    當您透過 | 運算子執行位元 OR 運算時,您將獲得到整數的隱式轉換。這是一種……奇怪的……轉換為整數的方式。要避免警告,只需顯式轉換即可。

    隱式:

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

    明確通過函數:

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

    或透過演員表:

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

    回覆
    0
  • 取消回覆