За последние 24 часа нас посетили 22162 программиста и 1683 робота. Сейчас ищут 1672 программиста ...

Округление дробных чисел

Тема в разделе "PHP для профи", создана пользователем Evgenij85, 19 фев 2018.

Метки:
  1. Evgenij85

    Evgenij85 Новичок

    С нами с:
    20 сен 2017
    Сообщения:
    48
    Симпатии:
    0
    Всем привет, ребята помогите разобраться с округлением дробных чисел
    у меня есть число к примеру 0,5569 мне нужно чтобы округление шло в меньшую строну 0,556
    из имеющихся функций только round подходит но он все равно не правильно округляет , как правильно округлить с минимальными затратами ?

    round(0.5569, 3, PHP_ROUND_HALF_DOWN) // результат 0.557
    round(0.5569, 3, PHP_ROUND_HALF_EVEN) // результат 0.557

    floor к целому числу округляет
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Evgenij85, как вариант: (int)(0.5569*1000)/1000;
     
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    надо подождать профи
    это слишком сложно
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Почему? Как по мне, то вполне нормальный вариант, хоть и не очень удобный.
    Еще можно так:
    PHP:
    1. <?php
    2. $number = 0.5569;
    3. echo bcdiv($number, 1, 3); // 0.556
     
    Maputo нравится это.
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Как бы эта функция тоже округляет
    --- Добавлено ---
    PHP:
    1. <?php
    2. echo number_format(0.5569, 3, '.', ''); // 0.557
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    :( Земля плоская!
     
  8. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    PHP:
    1. round(0.5569, 3, PHP_ROUND_HALF_EVEN) // результат 0.557
    2. // а может
    3. $result -= 0.001
    4. // результат 0,556
     
  9. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    @karmay
    и как тебе округлит 0.5564?
     
  10. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    как как, раком
    +1

    PHP:
    1. $a = 0.5569;
    2. $b = round($a, 3, PHP_ROUND_HALF_DOWN);
    3. echo $b-=0.001;
     
    #10 karmay, 23 фев 2018
    Последнее редактирование: 23 фев 2018
  11. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    хотя в документации написано, что должно округлять в меньшую сторону. Однако, если у нас число 1,55550 то ($a, 3, PHP_ROUND_HALF_DOWN) округлит до 1,555 , а вот если 1,55551 то уже будет 1.556
    х-ня какая-то, походу баг,
    НАДО ЖДАТЬ ПРОФЕССИОНАЛОВ
    а пока округляй в большую строну и последнюю цифру уменьшай на 1
     
  12. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Ды ты што, это же хардкод :)
     
  13. Evgenij85

    Evgenij85 Новичок

    С нами с:
    20 сен 2017
    Сообщения:
    48
    Симпатии:
    0
    number_format помоему он тоже округляет и число 4 знака после запятой как пример а вообще число может колебаться от 0,02 до 0,0000005555221215
     
  14. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Какой результат вы предполагаете увидеть в этом случае? 0.0000 или 0.0000005555, или еще что-то?
     
  15. Evgenij85

    Evgenij85 Новичок

    С нами с:
    20 сен 2017
    Сообщения:
    48
    Симпатии:
    0
    может не удачный пример , хотелось бы видить в числах
    0,12345988744 число после округления 0,12345 а не 0,12346
    или
    8,266655599 число после округления 8,2666555 а не 8,2666556
     
  16. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Рабочий вариант я вам уже показал выше. Что в нем не устраивает?
     
    Evgenij85 нравится это.
  17. Ferro7

    Ferro7 Активный пользователь

    С нами с:
    16 авг 2014
    Сообщения:
    5
    Симпатии:
    1
    Для таких операция используются функции повышенной точности. Например: https://php.ru/manual/ref.bc.html
    Как выше уже отметили,
    PHP:
    1. <?php
    2. $number = 0.123456789;
    3. echo bcdiv($number, 1, 5); // 0.12345
    --- Добавлено ---
    Как вариант для извращенцев:
    PHP:
    1. <?php
    2. $number = 0.123456789;
    3. $precision = 5;
    4. echo substr($number, 0, strpos($number, '.')) . substr($number, strpos($number, '.'), $precision + 1);
     
    Evgenij85 нравится это.
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    Это вообще не округление :)