整数を除算して整数値を取得する


83

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 Kanti Paul

上記を丸めると、次のようになります6。5または6は何が必要ですか。
Starx 2012年

1
@Starx:複数の丸めタイプがあります:en.wikipedia.org/wiki/Rounding#Tie-breaking。したがって、5.6を丸めると、何が得られるかわかりません(どのように丸めたいかを指定しないと)
zerkms 2012年

1
@zerkms、はい確かに機能などのceil()floor()違っ切り上げ関数です。
Starx 2012年

回答:


94

round()関数を使用して整数の丸められた値を取得します。

round(8 / 3); // 3

または

floor()関数を使用して整数値を取得します

floor(8 / 3); // 2

10
同意しないでください。floor(
-8/3

14
NOTは整数floor()を返すfloatので2.0、ではなく取得することに注意してください2。必ず整数を得ることを確認するために結果をキャスト:(int)floor(8/3)
ジェイソン

2
@ByScripts -8/3 = -3は、整数除算が-8/3 = -2と同じように機能する有効な方法です。前者は「負の無限大への切り捨て」であり、後者は「ゼロへの切り捨て」です。どちらにも利点があり、言語が異なれば異なる動作を選択します。たとえば、Cは(PHP 7のようにintdiv)ゼロに向かって切り捨てられますが、Pythonは負の無限大に向かって切り捨てられます。
マークアメリー2017年

ceil()は常に切り上げられることに注意してください。
アレス

70

PHP 7には、必要なことを正確に実行するintdiv関数があります。

使用法:

intdiv(8, 3);

を返します2


4
これは本当に大きな驚きです。この関数はPHP7でのみ導入されています:)まあ、これまでよりも遅くなりました。
Eric Gopak 2016

1
php 5.6にこのような解決策はありますか
Usman AliMaan18年

1
これほど簡単ではありません。PHP 5.6では、受け入れ答え:)使用
マレクLisý

21

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マニュアル


7

これを使って....

intval(1700000 / 300000 )...

これは整数値を返します。


6
(int)(1700000 / 300000);

型キャストを使用します。


4
ああ!(0.1 + 0.7)== 0.799999 ... 0.8ではなく:) :) :)
Jesse Chisholm

3
@ luc.chanteの例は、浮動小数点エラーが原因で発生します。の正確な値は(0.1 + 0.7) * 10です7.99999999999999911182158029987476766109466552734375(int)キャストがこの値を7に切り捨てるのは完全に正しいです。ここでの質問と回答の場合のように、整数を別の整数で除算する場合、このような浮動小数点エラーは切り捨て後の結果を変更できません。
マークアメリー

これにより、整数除算を行うときにC / C ++で期待されるとおりの動作が正確に再現されるため、問題はまったく発生しません。
AlexisWilke19年

6

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)PHP5と同等です。


5

末尾に| 0を追加すると、短縮形を使用できます

8/3 | 0


3
-1; これは、「ビット単位または」演算子の紛らわしい乱用です。確かに、それは機能します(ビット単位の演算子のオペランドは整数にキャストされるため、浮動小数点値が切り捨てられ、ビット単位または0を使用した実際の演算では、結果の整数値は変更されません)が、開発者がこのコードを読み取るためには、それが機能する理由を理解するには、PHPのビット演算子のキャスト動作(PHP開発者の99%が持っていないあいまいなトリビアの知識です)と、ビット単位または0を指定すると値が変更されないこと(すべてではないため、保証されません)の両方を知る必要がありますWeb開発者はビット演算を理解しています)。
マークアメリー2016

1
@ MarkAmery、mos開発者がそれについて知らないという事実は、それが機能しないという意味ではありません。そして明らかにそれは賛成する正当な理由です、それで人々はそれを使う方法を学ぶでしょう。
besi 2016

2
はい、混乱しているので、本番コードでは使用しないでください。ただし、問題の興味深い解決策であるという事実は変わりません
Tomasz Swider 2016

@TomaszSwider一部の人々はまた、最短の解決策を検索するかもしれません(特にいくつかのコードの課題で)。
besi 2016年

1
これはJavaScriptで常に使用されています。プログラマは...今ではこのトリックに注意する必要があります
アレクシス・ヴィルケ

4

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.