Integer Division Deep Dive: `intdiv()` vs.キャスティングの理解
intdiv()は真の整数部門を実行し、整数(int)が変動点精度エラーのリスクを負った後、整数に対してより安全です。 2。どちらもゼロに向かって切り捨てられますが、鋳造は、フロート表現の問題により、負または不正確な値で誤った結果をもたらす可能性があります。 3。INTDIV()はゼロ除数にDivisionByzeroErrorをスローしますが、(int)(5/0)はINFを変換した後に0になり、警告のみが発生します。 4.整数を備えた明確で信頼できる整数部門には、intdiv()を使用します。混合またはフロートの入力を処理する場合にのみキャスティングを使用しますが、精度の損失を避けるために慎重に検証します。 PHPで整数部門を実行する場合、正確性と明確さを求めてintdiv()を好みます。
PHPでIntegersを使用して作業する場合、部門は予想通りに動作しない場合があります。特に、クリーンな結果が必要な場合。 2つの一般的なアプローチがポップアップします。INTDIV intdiv()
関数を使用し、通常の分割の結果を整数にキャストします。どちらも整数の結果を与えることができますが、それらはフードの下で異なる動作をし、入力に応じて異なる結果を生み出すことができます。重要な違いとそれぞれを使用するタイミングを分解しましょう。

intdiv()
とは何ですか?
intdiv()
は、PHP 7に導入された内蔵PHP関数であり、整数部門を実行します。つまり、2つの整数を分割し、商を整数として返し、残りをゼロに切り捨てます。
構文:

intdiv(int $ dividend、int $ divisor):int
例:
Echo intdiv(7、2); //出力:3 Echo intdiv(-7、2); //出力:-3
この関数は、整数算術用に特別に設計されており、除数がゼロの場合はDivisionByZeroError
を投げます。

分割の結果をキャストするとどうなりますか?
別のアプローチは、通常の分割( /
)を使用してから、 (int)
を使用して結果を整数にキャストすることです。
echo(int)(7/2); //出力:3 echo(int)(-7 / 2); //出力:-3
一見、これはintdiv()
と同じように見えます。しかし、悪魔は詳細にあります。特に、マイナス数や浮遊点精度の問題を扱うとき。
主な違い: intdiv()
vs.キャスティング
1。負の数の動作
どちらの方法もゼロに向かって切り捨てられ(床はありません)、ほとんどの場合、同様に動作します。
intdiv(-9、4); // -2 (int)(-9 / 4); // -2
✅これまでのところ、とても良いです。しかし、浮遊点の不正確さが作用すると、物事は危険になります。
2。浮動小数点精密落とし穴
通常の部門( /
)はフロートを返し、フロートは小さな精度エラーを持つことができます。
$ x =(int)(7 / 0.1); // 7 / 0.1 = 70よね? var_dump($ x); // int(69)???!
待って - 何? 0.1
バイナリフローティングポイントで正確に表すことができないため、 7 / 0.1
69.999999
のようなものに評価され、 (int)
への鋳造は小数を切り捨て、 69
与えます。
しかし、 intdiv()
整数のみを受け入れるため、この正確なシナリオは発生しません。
3。安全性と入力検証を入力します
intdiv()
には整数オペランドが必要です。フロートを通過させると、PHPはそれらを静かに整数にキャストし、予期しない動作につながる可能性があります。
intdiv(7.9、2.1); //実際にintdiv(7、2)→3を計算します
したがって、 intdiv()
は整数に対してタイプが宣言されていますが、PHPは警告なしにINTに浮かびます。
一方、分割後のキャストは入力タイプを気にしません。それはあなたがそれを与えるものを何でも分割し、フロートの結果を切り捨てます。
いつ使用する必要がありますか?
これがクイックガイドです:
phen:
intdiv()
を使用してください。- 整数で作業していると確信しています。
- あなたは意味的に明確で、意図的な整数部門を望んでいます。
- 読みやすさのために、手動キャストよりも組み込み機能を好みます。
- 分割の明示的なエラー処理がゼロ(例外対サイレント
INF
またはfalse
)が必要です。
casting(
(int)($a / $b)
)を使用します。- 入力はフロートまたは混合タイプである可能性があります。
- 非統一ベースのスケーリングまたはユニット変換を行っています。
- ただし、注意してください。精度が重要な場合は、常に検証または回復してください。
round()
彼の丸めfloor()
ニーズに応じて、高精度が重要な場合はキャストを避けます。
ボーナス:エッジケースとゼロによる分割
表現 | 結果 /動作 |
---|---|
intdiv(5, 0) | DivisionByZeroError を投げます |
(int)(5 / 0) | 0 またはfalse を返しますか?実際: INF キャストはint→ 0 にキャストされます(ただし、警告をトリガー) |
intdiv(PHP_INT_MAX, 1) | 正常に動作します |
(int)(PHP_INT_MAX / 1) | 同じですが、フロート表現に依存しています。 |
例えば:
$ n = php_int_max; var_dump((int)($ n / 1)); //フロート精度の損失のためにphp_int_maxに等しくない場合があります!
まとめ
-
intdiv()
真の整数部門でより安全で明確です。 - casting after
/
はより柔軟ですが、浮遊点の癖のために壊れやすいです。 - どちらもゼロに向かって切り捨てられますが、キャストすることは精度の損失のリスクがあります。
- 常に入力を検証し、ゼロ除数や多数のようなエッジケースを検討してください。
整数ドメインにとどまるべき数学をしている場合は、 intdiv()
を好みます。それは、より予測可能で、明示的で、サイレントバグの傾向が少ないです。
基本的に:整数部門を意味する場合は、 intdiv()
を使用します。実際にフロートの入力が必要でない限り、キャストに頼らないでください。
以上がInteger Division Deep Dive: `intdiv()` vs.キャスティングの理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

useintl.numberformatwithuser-specificlocalesforcorrectdigitgroupinganddecimalseparators.2.formatcurrencyussingstyle: 'currency'withiso4217codesandlocale-depecificsymbolplacement.3.applycompalcompactnotation forlergentation for-entoentunhornversiabilityabilityaindationiadyaintation for-entation for for for-enctation for for for-enctating

BCMATH拡張機能を使用することは、PHP財務計算の精度を解くための鍵です。これは、ストリングを介して任意の精度で10進動作を実行し、浮動小数点数の丸めエラーを回避するためです。 2。結果が必要な小数点に正確であることを確認するために、常に文字列の形で渡され、スケールパラメーター(BCADD( '0.1'、 '0.2'、2)など)を設定する必要があります。 3.パラメーターを渡す前に精度が失われたため、浮動小数点数をBCMATH関数に直接渡すことを避けます。 4.財務計算が2つの小数を均一に保持するように、Bccale(2)を介してグローバルな小数の場所を設定できます。 5。BCMATHは、丸めではなくデフォルトの切り捨てを行い、丸めロジックを自分で実装する必要があります(BCROUND関数など)。 6.入力値を検証する必要があります。

PHP_INT_MAX(9223372036854775807など)を超える整数を処理する必要がある場合、1。 2。GMPはCライブラリに基づいており、高性能を備えていますが、サーバーサポートが必要です。 3.ブリック/数学は純粋なPHP実装であり、ポートが簡単ですが遅いです。 4.多数を初期化する場合、精度の損失を防ぐために文字列を使用する必要があります。 5.すべての操作は、正確さを確保するために浮動小数点数を回避する必要があります。最終的な選択は、環境制御の程度、パフォーマンス要件、コードスタイルの好みに依存しますが、文字列では大きな整数を安全に初期化する必要があります。

MT_RAND()ISNOTSECUREFORCRYPTOGRAPHICPURPOSESESTHEMERSENTHERTHERTHEMERSENTWISTRALGORITHM、それは、メイベポールライドをプロデュースすること、andNotDesignedForseCurity.2.ForsurerandomNumbergeneration、assumandom_int()asiddrawsproms()、assunradomnumbergeneration()

is_numeric()checksifavaluecanbetretedasanumber、compentformatslikehex、scientificnotation、andwhitespace、butonlyreturnsabooleanwithouttypecasting.2.filter_var()withfilter_validate_intorfilter_validate

特にフラグ、許可、およびcompactDataStorage.2.、^、^、〜、〜、〜、〜、〜、〜、tomanipulateIndidividualbits、Enablinableanbooleanflagmanagemenatewi

PHPのルーズタイプシステムは、数値変換では強力で危険です。 1.ゆるい比較(==)を使用すると、PHPは非数値文字列を0に変換し、「Hello '== 0になり、セキュリティの脆弱性を引き起こす可能性があります。必要に応じて、厳密な比較(===)は常に使用する必要があります。 2。算術操作では、PHPは「10Apples」が10になり、「Apples10」が0になり、計算エラーを引き起こす可能性があるなどの文字列を静かに変換します。入力は、is_numeric()またはfilter_var()を使用して検証する必要があります。 3。配列キーでは、「123」などの数値文字列が整数に変換され、「007」が7になり、形式が失われ、プレフィックスを追加することで回避できます。 4。関数パラメーター

不正確な浮動小数点数の問題は、PHP、特に財務計算または正確な比較で一般的です。根本的な原因は、小数小数点以下がバイナリ浮動点表現(IEEE754標準)に正確に保存できないため、0.1 0.2≠0.3などの結果が得られることです。 1.浮動小数点数の平等を比較する場合、==を直接使用する代わりに、許容値(epsilon)を使用する必要があります。 2。財務計算では、浮動小数点数の使用を避け、代わりに整数(部門単位など)またはBCMATH拡張機能を使用する必要があります。 3. BCMATHは、高精度のシナリオに適した文字列を介して任意の精度計算を実行しますが、パフォーマンスは低いです。 4. PHPタイプの変換は、エラーを導入するために文字列または整数を浮動小数点数に暗黙的に変換する可能性があることに注意する必要があります。要するに、不正確な浮動小数点数は一般的な計算の問題ですが、
