Разделите целое число и получите целое значение

85

В таких языках, как C или Python, если я делю целое число на целое число, я получаю целое число:

>>> 8/3
2

Но в PHP, если я делю целое число на другое целое с /, иногда я получаю число с плавающей запятой:

php > var_dump(6/3);
int(2)
php > var_dump(8/3);
float(2.6666666666667)

Я хотел бы сделать деление, как в Python или C, чтобы 8/3 было 2. Как я могу сделать это в PHP?

Исмаил Салех
источник
возможные повторяющиеся вопросы / 2055469
Nikson Kanti Paul
ЕСЛИ вы округлите вышесказанное, вы получите 6, что вам нужно 5 или 6?
Starx
1
@Starx: существует более одного типа округления: en.wikipedia.org/wiki/Rounding#Tie-breaking . Итак, если вы округлите 5,6 - вы не знаете, что получите (без указания того, как вы хотите округлить)
zerkms
1
@zerkms, да действительно функционируют как ceil()и floor()есть функции, которые округляются по разному.
Starx

Ответы:

94

используйте round()функцию, чтобы получить целое округленное значение.

round(8 / 3); // 3

или же

Используйте floor()функцию для получения целочисленного значения

floor(8 / 3); // 2
iLaYa ツ
источник
10
Не согласен. floor (-8 / 3) === -3.0, но должно быть -2
ByScripts
14
Обратите внимание, что floor()вернет floatНЕ целое число, поэтому вы получите 2.0и нет 2. Приведите результат, чтобы убедиться, что вы получили целое число:(int)floor(8/3)
Джейсон
2
@ByScripts -8/3 = -3 - такой же правильный способ работы целочисленного деления, как -8/3 = -2 . Первый - это «усечение в сторону отрицательной бесконечности», а второй - «усечение в сторону нуля». У обоих есть преимущества, и разные языки выбирают разное поведение. Например, C усекает до нуля (как и PHP 7 intdiv), а Python усекает до отрицательной бесконечности.
Марк Эмери
Обратите внимание, что ceil () всегда округляется в большую сторону.
Алесь
73

В PHP 7 есть функция intdiv, которая делает именно то, что вы хотите.

Применение:

intdiv(8, 3);

Возврат 2.

Марек Лисы
источник
5
Это действительно большой сюрприз: эта функция появилась только в PHP 7 :) Что ж, лучше поздно, чем никогда.
Эрик Гопак,
1
есть ли подобное решение в php 5.6
Усман Али Маан
1
Не так просто, нет. В PHP 5.6 используйте принятый ответ :)
Marek Lisý
23

В PHP нет оператора целочисленного деления. 1/2 дает поплавок 0,5. Значение может быть приведено к целому числу, чтобы округлить его в меньшую сторону, или функция round () обеспечивает более точный контроль над округлением.


var_dump(25/7);           // float(3.5714285714286)    
var_dump((int) (25/7));   // int(3)   
var_dump(round(25/7));    // float(4)     

Руководство по PHP

SP
источник
8

использовать этот....

intval(1700000 / 300000 )...

это возвращает целочисленное значение.

бипен
источник
5
(int)(1700000 / 300000);

использовать приведение типов.

Махипал Пурохит
источник
4
Ой! Просто потому, что (0,1 + 0,7) == 0,799999 ... вместо 0,8 :) :) :)
Джесси Чизхолм
3
@ luc.chante приведенный вами пример происходит из-за ошибки с плавающей запятой. Точное значение (0.1 + 0.7) * 10составляет 7.99999999999999911182158029987476766109466552734375. Совершенно правильно, что (int)приведение обрезает это значение до 7. При делении целого числа на другое целое число, как в случае вопроса и ответа здесь, такая ошибка с плавающей запятой не может изменить результат пост-усечения.
Марк Эмери
Это воспроизводит точное поведение, ожидаемое в C / C ++, при выполнении целочисленного деления, поэтому я вообще не вижу проблемы.
Alexis Wilke
5

Есть несколько способов выполнить целочисленное деление в PHP. В языке нет оператора для целочисленного деления, но есть несколько вариантов округления частного с плавающей запятой до целого числа:

<?php
$pos = 1;
$neg = -1;
$divisor = 2;

// No rounding (float division)
var_dump($pos / $divisor);          //  0.5 (float)
var_dump($neg / $divisor);          // -0.5 (float)

// Round toward zero (like C integer division)
var_dump((int)($pos / $divisor));   //  0 (int)
var_dump((int)($neg / $divisor));   //  0 (int)

// Round half away from zero
var_dump(round($pos / $divisor));   //  1 (float)
var_dump(round($neg / $divisor));   // -1 (float)

// Round down
var_dump(floor($pos / $divisor));   //  0 (float)
var_dump(floor($neg / $divisor));   // -1 (float)

# And on PHP 7 you can round toward zero with intdiv():
var_dump(intdiv($pos, $divisor));   //  0 (int)
var_dump(intdiv($neg, $divisor));   //  0 (int)  Rounded toward zero

В PHP 7 вы можете использовать intdiv($p, $q)для прямого целочисленного деления. Это эквивалентно (int)($p / $q)PHP 5.

Колин Д. Беннетт
источник
4

Вы можете использовать сокращенную форму, добавив | 0 в конец

8/3 | 0

Беси
источник
3
-1; это сбивающее с толку злоупотребление оператором «побитовое или». По общему признанию, это работает (поскольку операнды для побитовых операторов приводятся к целым числам, что округляет значения с плавающей запятой вниз, а фактическая операция побитового или с 0 не вызывает изменений в результирующем целочисленном значении), но для того, чтобы разработчик, читающий этот код, понять, почему это работает, им нужно знать как поведение приведения битовых операторов PHP (что является неясным знанием мелочей, которое не будет у 99% разработчиков PHP), так и то, что побитовое или с 0 оставляет значение неизменным (не гарантируется, поскольку не все веб-разработчики понимают битовые операции).
Mark Amery
1
@MarkAmery, тот факт, что разработчики не знают об этом, не означает, что это не работает. И, очевидно, это хорошая причина проголосовать, чтобы люди научились его использовать.
Беси
2
да, это сбивает с толку, поэтому его не следует использовать в производственном коде, но это не меняет того факта, что это интересное решение проблемы
Томаш Свидер
@TomaszSwider некоторые люди могут также искать кратчайшее решение (особенно в некоторых проблемах с кодом).
Беси
1
Это все время используется в JavaScript. Программисты уже должны знать об этом трюке ...
Alexis Wilke
3

ДЛЯ PHP 7 попробуйте intdiv()функцию:

Синтаксис: int intdiv($dividend, $divisor)

          <?php           
           $dividend = 19; 
           $divisor = 3;  
           echo intdiv($dividend, $divisor); 
           ?>

Для более старых версий PHP:

         <?php
     // Convert $total_minutes to hours and minutes.

         $total_minutes = 640;
         $minutes = $total_minutes % 60;
         $hours = ($total_minutes - $minutes) / 60;

         echo "Time taken was $hours hours $minutes minutes";
         ?>
Аамир Калими
источник
По состоянию на август 2019 года это единственно правильный ответ.
DomQ
0

Для PHP версии 7 => intdiv(a,b)

А для версий меньше 7 (например, 5.6) => (int)floor(abs(a/b))

sanjay.chouhan180
источник
Не работает для больших целых чисел. См stackoverflow.com/questions/54606140
Wiimm