Hàm Floor trong PHP trả về sai giá trị

Hi mọi người, mình gặp lỗi này không biết vì sao,
Hàm Floor trả về 999 trong khi đúng phải là 1000

<?php
$one_thousand = 1080 / (1.08);

echo $one_thousand; // 1000
echo '<br/>';
echo floor(1000); // 1000
echo '<br/>';
echo floor($one_thousand); // 999 ???

Mọi người xem giúp mình lỗi ở đâu, thanks :heart:

Phép tính này chình xác, lời giải thích liên quan đến floating point nhé.

1.08 không phải là decima nên được mô tả trên máy tính bằng floating point, và khi đó mọi phép tính liên quan đến số thập phân đều là gần đúng. Bạn có thể debug bằng script dưới đây:

<?php

ini_set("precision", 20);

$not_really_one_thousand = 1080 / (1.08);

echo var_dump($not_really_one_thousand); // float(999.99999999999988631)
echo '<br/>';
echo floor($one_thousand); // 999 ???

Và khi giá trị của 1080/1.08 là float(999.99999999999988631) thì khi làm tròn xuống floor sẽ là 999.

1 Like

Cảm ơn bạn, mình cũng mắc mớ mất mấy ngày,
Hàm echo trả về string và nó tự làm tròn những số 999.9999999999999 thành 1000 (Cái này giống như bug), nhưng lại đúng. Vì thực sự 1080 / (1.08) = 1000.

Vậy giải pháp của mình là:

floor((string)$not_really_one_thousand); // 1000
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?