정수를 나누고 정수 값 얻기


85

C 또는 Python과 같은 언어에서 정수를 정수로 나누면 정수를 얻습니다.

>>> 8/3
2

그러나 PHP에서 정수를 다른 정수로 나누면 /때때로 부동 소수점을 얻습니다.

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

8/3이 2가되도록 Python이나 C와 같이 나누고 싶습니다. PHP에서 어떻게 할 수 있습니까?



위를 반올림하면, 65 또는 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
동의하지 마십시오. floor (-8 / 3) === -3.0하지만 -2 여야 함
ByScripts

14
참고 floor()반환하며 float당신이 얻을 수 있도록, 정수하지 2.0하지 2. 결과를 캐스트하여 정수를 얻었는지 확인합니다.(int)floor(8/3)
Jason

2
@ByScripts -8/3 = -3 은 정수 나누기가 -8/3 = -2 처럼 작동하는 유효한 방법입니다 . 전자는 "음의 무한대로 자르기"이고 후자는 "0으로 자르기"입니다. 둘 다 장점이 있으며 언어마다 다른 동작을 선택합니다. 예를 들어, C는 (PHP 7과 마찬가지로) 0으로 intdiv자릅니다. 반면 Python은 음의 무한대로 자릅니다.
Mark Amery

ceil ()은 항상 반올림됩니다.
Ales

73

PHP 7에는 원하는 것을 정확히 수행하는 intdiv 함수가 있습니다.

용법:

intdiv(8, 3);

를 반환 2합니다.


5
이 함수가 PHP 7에서만 소개된다는 사실은 정말 놀랍습니다.
Eric Gopak

1
PHP 5.6에서이 같은 모든 솔루션이있다
우스만 알리 MAAN가

1
이만큼 간단하지는 않습니다. PHP 5.6에서 허용 대답 : 사용
마렉 Lisý

23

PHP에는 정수 나누기 연산자가 없습니다. 1/2은 float 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 ++에서 예상대로 정확한 동작을 재현하므로 전혀 문제가 발생하지 않습니다.
Alexis Wilke 19 년

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; 이것은 "비트 or"연산자를 혼동스럽게 남용하는 것입니다. 사실, 작동하지만 (비트 연산자에 대한 피연산자는 정수로 캐스팅되어 부동 값을 반올림하고 비트 또는 0의 실제 연산으로 인해 결과 정수 값이 변경되지 않기 때문에) 개발자가이 코드를 그것이 작동 하는 이유를 이해 하려면 PHP의 비트 연산자의 캐스팅 동작 (PHP 개발자의 99 %가 가지고 있지 않은 모호한 퀴즈 지식)과 비트 또는 0이 값을 변경하지 않는다는 점을 모두 알아야합니다. 웹 개발자는 비트 작업을 이해합니다.)
Mark Amery 2016

1
@MarkAmery, mos 개발자가 그것에 대해 모른다는 사실이 작동하지 않는다는 것을 의미하지는 않습니다. 그리고 분명히 그것이 찬성 투표를하는 좋은 이유입니다. 그래서 사람들은 그것을 사용하는 방법을 배울 것입니다.
Besi

2
예 그렇게 혼란 프로덕션 코드에서 사용할 수 없습니다해야하지만, 그것이 문제에 대한 흥미로운 해결책이 사실을 변경하지 않습니다
토마스 Swider

@TomaszSwider 일부 사람들은 가장 짧은 솔루션을 검색 할 수도 있습니다 (특히 일부 코드 문제에서).
Besi

1
이것은 JavaScript에서 항상 사용됩니다. 프로그래머는 ... 지금이 트릭을 알고 있어야합니다
알렉시스 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 년 8 월 현재 이것이 유일한 정답입니다.
DomQ

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.