この質問から派生しました:(Java)Javaは負の数でモジュラス計算をどのように行いますか?
PHPに正の51を返すように強制する場所はありますか?
更新
する代わりに、修正する構成設定を探しています
または bcmath のような他の数学関数ですか?
更新
負のモジュラスを考慮していないため、そのJavaの回答に完全には納得していません
-13+(-64) =?
この質問から派生しました:(Java)Javaは負の数でモジュラス計算をどのように行いますか?
PHPに正の51を返すように強制する場所はありますか?
更新
する代わりに、修正する構成設定を探しています
または bcmath のような他の数学関数ですか?
更新
負のモジュラスを考慮していないため、そのJavaの回答に完全には納得していません
-13+(-64) =?
とにかく、あなたが参照した投稿はすでに正しい答えを与えました:
$r = $x % $n;
if ($r < 0)
{
$r += abs($n);
}
$x = -13 および $n = 64 です。
n モジュロ d を計算します。結果は常に負ではなく、d の符号は無視されます。
例:
echo gmp_strval(gmp_mod('-13', '64')); // 51
n
andd
は、GMP 番号リソースまたは数値文字列でなければならないことに注意してください。それ以外は機能しません¹
echo gmp_strval(gmp_mod(-13, 64));
echo gmp_mod(-13, 64);
どちらも代わりに -51 を返します (これはバグです)。
¹この コードパッドで上記を実行すると、3 つのケースすべてで 51 が生成されます。私の開発マシンではそれはできません。
モジュロ演算は、数値を別の数値で除算した剰余を見つける必要があります。ただし、厳密に言えば、ほとんどの主流のプログラミング言語では、被除数または除数が負の場合、モジュロ演算が誤動作します。これには、PHP、Perl、Python、Java、C、C++ などが含まれます。
なぜ故障と言うのですか?数学的な定義によると、剰余はゼロまたは正でなければならないためです。
簡単な解決策は、ケースを自分で処理することです。
if r < 0 then r = r + |divisor|;
|除数| 除数の絶対値です。
別の解決策は、ライブラリを使用することです(@Gordonが指摘したように)。ただし、このような単純なケースを処理するためにライブラリを使用することはありません。
PHPのマニュアルには、
剰余演算子 % の結果は被除数と同じ符号を持ちます — つまり、$a % $b の結果は $a と同じ符号を持ちます。例えば
したがって、これは構成できません。リンク先の質問で提案されているオプションを使用してください