2010年9月29日水曜日

-1を3で割ったら余りはいくつ?

こんにちは。シナプスソフトのかわせ@おばグラマです。

案の定、社内の誰も更新しやがりませんねぇ。。。
この手のものは、強制力がないとやらないものなんですね、やっぱり。

さて、気を取り直して、今日の記事は「-1を3で割ったら余りはいくつ?」です。
ぐだぐだ言うより結果をみましょうか。

Mod.java

public class Mod {
public static void main(String args[]) {
int retValue = -1 % 3;
System.out.println(retValue);
}
}


クリックで拡大します。

結果は
PHP,JAVA :-1
python, perl, ruby:2

この「 % 」は剰余 ( modulo:モジュロ ) 演算子といいます。
負の数のときは挙動がプログラムによって違うのですね。
理屈はいろいろあるんでしょうが、子供の頃に「 3 x 0 + (-1) = -1 」と習ったので、結果が -1 と出てくれたほうがわかりやすいです。

3 件のコメント:

  1. float % 1 の挙動も言語によって違うみたいです。

    Pythonの場合はfloatの小数部分が返ってきて、
    PHPだと必ず0が返ってきます。
    PHPは勝手にint値に丸めちゃうみたいです。

    「1234.5 % 1」は、
    PHP, Perl => 0
    Python, Ruby, Java => 0.5

    ●PHP
    $ php -a
    Interactive shell

    php > $float = 1234.5;
    php > echo $float % 1;
    0
    php > echo $float - (int)$float;
    0.5
    php >

    ●Python
    $ python
    Python 2.5.5 (r255:77872, Mar 31 2010, 21:03:05)
    [GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 1234.5 % 1
    0.5

    返信削除
  2. float の剰余演算の場合、 PHP には fmod() っていう関数がありますが、他はどうなんでしょうか…? 数学的には1つしかないと思うのに、言語によってバラバラっていうのが不思議です。

    ところで、irb とか php -a みたいに対話的に perl でやる方法ってないんですかねー。

    返信削除
  3. > ところで、irb とか php -a みたいに対話的に perl でやる方法ってないんですかねー。

    ってことで自己解決編。
    -------------------------------
    [web@job ~]$ perl -d -e 1

    Loading DB routines from perl5db.pl version 1.27
    Editor support available.

    Enter h or `h h' for help, or `man perldebug' for more help.

    main::(-e:1): 1
    DB<1> $v = -1 % 3
    DB<2> print $v
    2
    DB<3> q
    [web@job ~]$
    -------------------------------
    DB<1> のところで my を入れてローカル変数宣言したらダメです。

    返信削除