Tamsayıyı böl ve tamsayı değeri al


85

C veya Python gibi dillerde, bir tamsayıyı bir tam sayıya bölersem, bir tam sayı elde ederim:

>>> 8/3
2

Ancak PHP'de, bir tamsayıyı başka bir tam sayıya bölersem /, bazen bir float elde ederim:

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

Python veya C'de olduğu gibi bölme yapmak istiyorum, böylece 8/3, 2'dir. Bunu PHP'de nasıl yapabilirim?



Yukarıdakileri yuvarlarsanız, elde edersiniz 6, neye ihtiyacınız var 5 veya 6?
Starx

1
@Starx: Birden fazla yuvarlama türü vardır: en.wikipedia.org/wiki/Rounding#Tie-breaking . Yani 5.6 yuvarlak eğer - Eğer (bunu yuvarlak olmak istiyorum nasıl belirtmeden) ne olsun bilmiyorum
zerkms

1
gibi @zerkms, evet gerçekten de fonksiyon ceil()ve floor()o mermi yukarı farklı işlevleri vardır.
Starx

Yanıtlar:


94

kullanmak round()yuvarlanmış bir değer tam sayı almak için bir işlev.

round(8 / 3); // 3

veya

floor()Tamsayı değerini almak için işlevi kullanın

floor(8 / 3); // 2

10
Kabul etmeyin. floor (-8 / 3) === -3.0 ancak -2 olmalıdır
ByScripts

14
Not floor()Bir dönecektir floatgetirecek şekilde, bir tamsayı DEĞİL 2.0değil 2. Bir tam sayı aldığınızdan emin olmak için sonucu (int)floor(8/3)
Jason

2
@ByScripts -8/3 = -3 , tamsayı bölümünün -8/3 = -2 olarak çalışması için geçerli bir yoldur . İlki "negatif sonsuzluğa doğru kesme" ve ikincisi "sıfıra doğru kesme" dir. Her ikisinin de avantajları vardır ve farklı diller farklı davranışları seçer. Örneğin, C sıfıra doğru kesilir (PHP 7'de olduğu gibi intdiv), Python ise negatif sonsuza doğru keser.
Mark Amery

Ceil () 'in her zaman yukarı yuvarlandığını unutmayın.
Ales

73

PHP 7'de, tam olarak istediğinizi yapan intdiv işlevi vardır .

Kullanım:

intdiv(8, 3);

İade 2.


5
Bu gerçekten büyük bir sürpriz, bu işlevin sadece PHP 7 ile sunulması :) Ah, geç olması hiç olmamasından iyidir.
Eric Gopak

1
php 5.6'da buna benzer bir çözüm var mı
Usman Ali Maan

1
Bu kadar basit değil, hayır. PHP 5.6'da kabul edilen cevabı kullanın :)
Marek Lisý

23

PHP'de tamsayı bölme operatörü yoktur. 1/2, şamandırayı 0,5 verir. Değer, aşağı doğru yuvarlanmak için bir tam sayıya dönüştürülebilir veya round () işlevi yuvarlama üzerinde daha hassas kontrol sağlar.


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

PhP kılavuzu


8

bunu kullan....

intval(1700000 / 300000 )...

bu tamsayı değerini döndürür.


5
(int)(1700000 / 300000);

tip döküm kullanın.


4
Ah! Sırf (0.1 + 0.7) == 0.799999 ... 0.8 yerine :) :)
Jesse Chisholm

3
@ luc.chante verdiğiniz örnek kayan nokta hatası nedeniyle gerçekleşiyor. Kesin değeri (0.1 + 0.7) * 10olan 7.99999999999999911182158029987476766109466552734375. Bir (int)çevrimin bu değeri 7'ye indirmesi tamamen doğrudur . Soru ve cevapta olduğu gibi, bir tamsayıyı başka bir tam sayıya bölerken, böyle bir kayan nokta hatası, kesme sonrası sonucu değiştiremez.
Mark Amery

Bu, bir tamsayı bölmesi yaparken C / C ++ 'da beklendiği gibi tam davranışı yeniden üretir, bu nedenle bir sorun görmüyorum.
Alexis Wilke

5

PHP'de tamsayı bölme yapmanın birkaç yolu vardır. Dilde tamsayı bölme operatörü yoktur, ancak kayan nokta bölümünü bir tam sayıya yuvarlamak için birkaç seçenek vardır:

<?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'de intdiv($p, $q)doğrudan tamsayı bölme işlemi yapmak için kullanabilirsiniz . Bu, (int)($p / $q)PHP 5 ile eşdeğerdir .


4

Kısa formu sonuna | 0 ekleyerek kullanabilirsiniz

8/3 | 0


3
-1; bu, "bitsel veya" operatörün kafa karıştırıcı bir şekilde kötüye kullanılmasıdır. Kuşkusuz, çalışır (bitsel işleçlere işlenenler tamsayılara dönüştürüldüğünden, kayan değerleri aşağı yuvarladığından ve bit düzeyinde veya 0 ile gerçek işlem, sonuçta ortaya çıkan tamsayı değerinde hiçbir değişikliğe neden olmaz), ancak bu kodu okuyan bir dev için neden işe yaradığını anlayın, hem PHP'nin bitsel operatörlerinin çevrim davranışını (ki bu, PHP geliştiricilerinin% 99'unun sahip olmayacağı belirsiz önemsiz bilgi bilgisine sahip değildir) hem de bitsel veya 0 değerinin değişmeden bıraktığını (garanti edilmez, çünkü hepsi web geliştiricileri bit işlemlerini anlar).
Mark Amery

1
@MarkAmery, mos geliştiricilerin bunu bilmemesi, işe yaramadığı anlamına gelmez. Ve açıkçası bu, olumlu oy vermek için iyi bir neden, böylece insanlar onu nasıl kullanacaklarını öğrenecekler.
Besi

2
evet çok kafa karıştırıcı üretim kodunda kullanılmamalıdır, ama buna soruna ilginç bir çözüm olduğu gerçeğini değiştirmez
Tomasz Swider

@TomaszSwider bazı kişiler de en kısa çözümü arayabilir (özellikle bazı kod zorluklarında).
Besi

1
Bu, JavaScript'te her zaman kullanılır. Programcılar şimdiye kadar bu numaranın farkında olmalılar ...
Alexis Wilke

3

PHP 7 İÇİN intdiv()Fonksiyonu deneyin :

Sözdizimi: int intdiv($dividend, $divisor)

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

PHP'nin eski sürümleri için:

         <?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";
         ?>

Ağustos 2019 itibariyle tek doğru cevap budur.
DomQ

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.