Функция вокруг PHP не работает правильно

Функция php round не работает правильно. У меня есть номер 0.9950, Я поставил код:

$num = round("0.9950", 2);

И я получаю 1,0? Зачем?? Почему я не могу получить 0.99?

2 ответа

Решение

Вы можете добавить третий параметр в функцию, чтобы она делала то, что вам нужно. Вы должны выбрать один из следующих:

  • PHP_ROUND_HALF_UP
  • PHP_ROUND_HALF_DOWN
  • PHP_ROUND_HALF_EVEN
  • PHP_ROUND_HALF_ODD

Эти константы достаточно просты для понимания, поэтому просто используйте адаптированную:) В вашем примере, чтобы получить 0,99, вам нужно использовать:

<?php echo round("0.9950", 2, PHP_ROUND_HALF_DOWN); ?>

DEMO

Только что протестировал в PHP Sandbox... PHP иногда кажется забавным.

<?php
    $n = 16.90;
    echo (100*$n)%100, "\n"; // 89
    echo (int)(100*$n)%100, "\n"; // 89
    echo 100*($n - (int)($n)), "\n"; // 90
    echo (int)(100*($n - (int)($n))), "\n"; // 89
    echo round(100*($n - (int)($n))), "\n"; // 90

Когда вы вокруг 0.9950 до двух знаков после запятой, вы получите 1.00 потому что так работает округление. Если вы хотите операцию, которая приведет к 0.99 тогда, возможно, вы ищете усечение с плавающей запятой. Один из вариантов усечения числа с плавающей запятой до двух десятичных знаков - умножить на 100, привести к целому числу, а затем снова разделить на 100:

$num = "0.9950";
$output = (int)(100*$num) / 100;
echo $output;

0.99

Этот трюк работает, потому что после первого шага 0.9950 становится 99.50, который, когда приведен к целому числу становится просто 99, отбрасывая все после второго знака после запятой в исходном числе. Затем мы снова делим на 100 чтобы восстановить исходное число, минус то, что мы хотим обрезать.

демонстрация

Другие вопросы по тегам