7

divmodに関するドキュメントを調べています。divメソッド、divmodmodulo、の違いを示す表の一部をremainder以下に示します。

ここに画像の説明を入力

13.div(-4)が に丸められ、に丸められ-4ないのはなぜ-3ですか? 負の数を切り捨てるためのRubyの規則や規則はありますか? もしそうなら、次のコードが切り捨てられないのはなぜですか?

-3.25.round()  #3
4

1 に答える 1

6

13.div(-4) == -4そして13.modulo(-4) == -3そのように

(-4 * -4) + -3 == 13

一貫した関係が得られます

(b * (a/b)) + a.modulo(b) == a

13.div(-4) が -3 ではなく -4 に丸められるのはなぜですか?

これは誤解です。13.div(-4)はまったく丸められいません。これは整数除算であり、整数と剰余算術を扱うための一貫した規則に従います。リンクで説明されている丸めロジックはそれに適合し、divmod一方または両方のパラメーターがFloats の場合に同じ操作を処理するときに一貫して適用されます。負の数または分数の数学的操作は、多くの場合、この種の方法で正の整数のより単純で直感的な結果から拡張されます。たとえば、これは、分数と負の累乗、または非整数の階乗が正の整数バリアントから作成される方法と同様のロジックに従います。

この場合、すべては の自己整合性に関するものですdivmodが、一般的な丸めに関するものではありません。

Ruby の設計者は、負の数を処理する際に選択を迫られました。すべての言語で同じ結果が得られるわけではありません。ただし、Ruby が除数に一致するモジュロ結果の符号を返すことが決定されると (除算全体に一致するのではなく)、残りの数値がどのように機能するかが設定されます。

負の数を切り捨てるためのRubyの規則や規則はありますか?

はい。浮動小数点数を丸めるということは、数値的に最も近い整数を返すことを意味します。2 つの同等に近い整数がある場合、Ruby は 0 から最も離れた整数に丸めます。これは、整数除算およびモジュロ算術メソッドがどのように機能するかとはまったく別の設計上の決定です。

もしそうなら、次のコードが切り捨てられないのはなぜですか?-3.25.round() #3

読む結果を意味していると思います-3。round メソッドは「切り捨て」ません。「最も近いラウンド」を行います。-3に最も近い整数-3.25です。ただし、Ruby の設計者は、-3.5.round() # -4. 一部の言語では、その数値を四捨五入すると、代わりに -3 が返されます。

于 2013-11-09T08:29:48.020 に答える