12

この質問から派生しました:(Java)Javaは負の数でモジュラス計算をどのように行いますか?

PHPに正の51を返すように強制する場所はありますか?

更新
する代わりに、修正する構成設定を探しています

または bcmath のような他の数学関数ですか?

更新
負のモジュラスを考慮していないため、そのJavaの回答に完全には納得していません -13+(-64) =?

4

5 に答える 5

16

とにかく、あなたが参照した投稿はすでに正しい答えを与えました:

$r = $x % $n;
if ($r < 0)
{
    $r += abs($n);
}

$x = -13 および $n = 64 です。

于 2010-12-10T13:34:30.077 に答える
7

GMPが利用可能な場合は、使用できますgmp_mod

n モジュロ d を計算します。結果は常に負ではなく、d の符号は無視されます。

例:

echo gmp_strval(gmp_mod('-13', '64')); // 51

nanddは、GMP 番号リソースまたは数値文字列でなければならないことに注意してください。それ以外は機能しません¹

echo gmp_strval(gmp_mod(-13, 64));
echo gmp_mod(-13, 64);

どちらも代わりに -51 を返します (これはバグです)。

¹この コードパッドで上記を実行すると、3 つのケースすべてで 51 が生成されます。私の開発マシンではそれはできません。

于 2010-12-10T13:43:57.520 に答える
4

モジュロ演算は、数値を別の数値で除算した剰余を見つける必要があります。ただし、厳密に言えば、ほとんどの主流のプログラミング言語では、被除数または除数が負の場合、モジュロ演算が誤動作します。これには、PHP、Perl、Python、Java、C、C++ などが含まれます。

なぜ故障と言うのですか?数学的な定義によると、剰余はゼロまたは正でなければならないためです

簡単な解決策は、ケースを自分で処理することです。

if r < 0  then r = r + |divisor|;

|除数| 除数の絶対値です。

別の解決策は、ライブラリを使用することです(@Gordonが指摘したように)。ただし、このような単純なケースを処理するためにライブラリを使用することはありません。

于 2011-01-14T11:10:42.710 に答える
0

PHPのマニュアルには、

剰余演算子 % の結果は被除数と同じ符号を持ちます — つまり、$a % $b の結果は $a と同じ符号を持ちます。例えば

したがって、これは構成できません。リンク先の質問で提案されているオプションを使用してください

于 2010-12-10T13:42:24.870 に答える