Поділіть ціле число і отримайте ціле значення


85

У таких мовах, як C або Python, якщо я розділю ціле число на ціле, я отримую ціле число:

>>> 8/3
2

Але в PHP, якщо я ділю ціле число на інше ціле число /, іноді я отримую float:

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

Я хотів би зробити поділ, як у Python або C, щоб 8/3 було 2. Як я можу це зробити в PHP?


можливі дублікати запитань / 2055469
Nikson

ЯКЩО заокруглити вищезазначене, ви отримаєте 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

10
Не погоджуйтесь. поверх (-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 усікується до негативної нескінченності.
Mark Amery

Зверніть увагу, що ceil () завжди округлюється.
Алесь

73

У PHP 7 функція intdiv робить саме те, що ви хочете.

Використання:

intdiv(8, 3);

Повернення 2.


5
Це справді чудовий сюрприз, ця функція представлена ​​лише з PHP 7 :) Ну, краще пізніше, ніж ніколи.
Ерік Гопак,

1
чи є таке рішення у php 5.6
Усман Алі Маан

1
Не так прямолінійно, як це, ні. У PHP 5.6 використовуйте прийняту відповідь :)
Марек Ліси

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


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. При діленні цілого числа на інше ціле число, як це має місце у питанні та відповіді тут, така помилка з плаваючою комою не може змінити результат після усічення.
Mark Amery

Це відтворює точну поведінку, як очікувалося в C / C ++ при виконанні цілочисельного ділення, тому я взагалі не бачу проблеми.
Алексіс Вільке,

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, той факт, що розробники MOS про це не знають, не означає, що це не працює. І, очевидно, це вагомий привід проголосувати, щоб люди навчились ним користуватися.
Бесі

2
так, це заплутано, тому його не слід використовувати у виробничому коді, але це не змінює той факт, що це цікаве рішення проблеми
Томаш Свідер

@TomaszSwider деякі люди можуть також шукати найкоротше рішення (особливо в деяких завданнях коду).
Besi

1
Це використовується у JavaScript постійно. Програмісти вже повинні знати про цей трюк ...
Алексіс Вільке,

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.