2013-08-06 11 views
12

モジュラス演算子は残りを表示することになっています。 echo(34%100)の場合は34のように出力されます。しかし、なぜ私はecho(34%4294967296)モジュラスを使用しているときにゼロ除算

+1

使用 'エコーFMOD(34、4294967296);' 'プリント34' –

+0

使用'エコーbcmod('34' 、 '4294967296'); '[プリント' 34']( http://3v4l.org/5lYTP) –

+0

fmodとbcmodの両方が動作するようになりましたが、今はどちらを使うのが混乱しています。私は膨大な数を処理していますが、関数bcmodまたはfmodをお勧めしますか? –

答えて

16

42949672962^32で、32ビットの数値として表すことができない、このコードは、「Division by zero」エラーが出るん - それが0に戻ってラップあなたがPHPの64ビット版を使用している場合は、それが動作する可能性があります。

浮動小数点モジュラスfmodを使用して、オーバーフローしないようにすることができます。

+0

はい、私はその説明をhttp://computer-programming-forum.com/53-perl/f2805415f84c54e1.htmで説明していますが、どのようにバグを克服するには?何か修正や別の方法ラウンドはありますか? –

+2

64ビットのPHPはまだWindows上で64ビット整数をサポートしていないため、それでも役に立たない場合もあります。 – garrettmurray

+0

私はfmodへのリンクを追加しました – mvp

7

https://bugs.php.net/bug.php?id=51731

2^31 is the largest integer you can get on Windows.

あなたはまだbcmodを使用し、多数の国防省します。

+0

だから、bcmodとfmodの違いは何ですか? –

+0

Fmodは両側を浮動小数点に変換します.bcmodは「任意の精度の数値」(それは独自の数値型です)を使用します。 –

+0

@ NeilNeymanああ、fmodは正確な値を表示し、bcmodは値を丸めますか? –

2

modには、PHPで大きな整数を使ってうごめくという報告がたくさんあります。計算のオーバーフローやバグを与える数字そのものであってもかまいません。そのために多数のライブラリを使用するのがベストです。 gmpまたはbcmathをチェックしてください。

0

「モジュラスを使用しているときのゼロ除算」を検索するこの質問が見つかりましたが、その理由は異なりました。

モジュラス(%演算子)は、denomenatorが1未満のときは機能しません。fmod()を使用すると問題が解決します。

例:

$num = 5.1; 
$den = .25; 

echo ($num % $den); 
// Outputs Warning: Division by zero 
echo fmod($num, $den); 
// Outputs 0.1 

$num = 5.1; 
$den = 1; 

echo ($num % $den); 
// Outputs 0, which is incorrect 
echo fmod($num, $den); 
// Outputs 0.1, which is correct 
関連する問題