2012-10-11 86 views
47

如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?

+0

可能重複[questions/2055469](http://stackoverflow.com/questions/2055469/php-typecasting-float-int) –

+0

如果您將以上內容取消,您將獲得'6',你需要5或6? – Starx

+1

@Starx:有多種舍入類型:http://en.wikipedia.org/wiki/Rounding#Tie-breaking。所以,如果你輪到5.6 - 你不知道你得到了什麼(沒有指定你想如何舍入) – zerkms

回答

64

使用round()函數來獲得整數四捨五入的值。

round(8/3); // 3 

使用floor()函數來獲取整數值

floor(8/3); // 2 
+6

不同意。地板(-8/3)=== -3。0,但應該是-2 – ByScripts

+6

請注意,'floor()'將返回一個'float'不是一個整數,所以你得到'2.0'而不是'2'。施加結果以確保你得到一個整數:'(int)floor(8/3)' – Jason

+0

@ByScripts * -8/3 = -3 *與整數分割的工作方式一樣有效,就像* -8/3 = -2 *。前者是「向負無窮的截斷」,後者是「截至零」。兩者都有優勢,不同的語言選擇不同的行爲。例如,C截斷爲零(正如PHP 7的'intdiv'),而Python截斷爲負無窮大。 –

19

沒有整數除法運算符在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 manual

3

使用本....

intval(1700000/300000)... 

此返回整數值。

3
(int)(1700000/300000); 

使用類型鑄造。

+4

永遠不會拋出float到int! <?php echo(int)((0.1 + 0.7)* 10); ?>「7」! –

+3

噢!只是因爲(0.1 + 0.7)== 0.799999 ...而不是0.8 :) :) :) –

+2

@ luc.chante您給出的示例是由於浮點錯誤而發生的。 '(0.1 + 0.7)* 10'的確切值是'7.99999999999999911182158029987476766109466552734375'。 ((int)''''''''''''''強制轉換爲7的完全正確的。當將整數除以另一個整數時,就像這裏的問題和答案一樣,這樣的浮點錯誤不能改變截斷後的結果。 –

30

在PHP 7中,有intdiv函數正在做你想要的。

用法:

intdiv(8, 3); 

返回2

+1

這真的是一個很大的驚喜,這個功能只能在PHP 7中引入:)哦,遲到比從未更好。 –

1

您可以通過添加使用簡短| 0至年底

8/3 | 0

+2

-1;這是對「按位或」運算符的混淆濫用。無可否認,它*工作*(因爲操作數到按位運算符被轉換爲整數,這會將浮點值向下舍入,實際操作按位或0不會導致生成的整數值發生變化),但是爲了讓開發人員讀取代碼來理解*爲什麼*它的工作原理,他們需要知道PHP的按位運算符的投射行爲(這是99%的PHP開發人員所不具備的瑣碎知識),並且按位或0保留一個值不變(不保證,因爲並不是所有的web開發人員都瞭解位操作)。 –

+0

@MarkAmery,mos開發人員不知道這一事實並不意味着它不起作用。很明顯,這是一個很好的理由,所以人們會學習如何使用它。 – Besi

+1

代碼高爾夫贏得 –

3

有幾種方法在PHP中執行整數除法。語言不具有整數除法操作,但也有四捨五入浮點商爲整數幾種選擇:

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

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

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

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

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

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

在PHP 7,您可以使用intdiv($p, $q)直接執行整數除法。這相當於在PHP 5上的(int)($p/$q)

+1

請注意,並非所有這裏顯示的方法都具有相同的返回類型 - 「(int)'cast和'intdiv()'調用返回int,但round()和floor()都返回float。 –