From: Tanaka Akira Date: 2014-10-02T14:14:42+09:00 Subject: [ruby-list:49979] Re: 引き算の結果 2014-10-02 13:35 GMT+09:00 ml-reader : > 下のような結果ってそういうものなのでしょうか。 単純に言ってしまえば、そういうものなのではないでしょうか。 > $ ruby -e 'puts 16.236-15.748' > 0.4880000000000013 10進数で考えているときに期待される値に対して、浮動小数点で表現可能な値として、 25個ぐらいずれているようですね。 % ./ruby -e 'v = 16.236-15.748; 30.times { p [v, v == 0.488]; v = v.prev_float }' [0.4880000000000013, false] [0.48800000000000127, false] [0.4880000000000012, false] [0.48800000000000116, false] [0.4880000000000011, false] [0.48800000000000104, false] [0.488000000000001, false] [0.48800000000000093, false] [0.4880000000000009, false] [0.4880000000000008, false] [0.48800000000000077, false] [0.4880000000000007, false] [0.48800000000000066, false] [0.4880000000000006, false] [0.48800000000000054, false] [0.4880000000000005, false] [0.48800000000000043, false] [0.4880000000000004, false] [0.4880000000000003, false] [0.48800000000000027, false] [0.4880000000000002, false] [0.48800000000000016, false] [0.4880000000000001, false] [0.48800000000000004, false] [0.488, true] [0.48799999999999993, false] [0.4879999999999999, false] [0.4879999999999998, false] [0.48799999999999977, false] [0.4879999999999997, false] > $ ruby -e 'puts 16.111-15.009' > 1.1020000000000003 こちらはひとつずれているだけのようです。 % ./ruby -e 'v = 16.111-15.009; 10.times { p [v, v == 1.102]; v = v.prev_float }' [1.1020000000000003, false] [1.102, true] [1.1019999999999999, false] [1.1019999999999996, false] [1.1019999999999994, false] [1.1019999999999992, false] [1.101999999999999, false] [1.1019999999999988, false] [1.1019999999999985, false] [1.1019999999999983, false] なお、prev_float (と next_float) は Ruby 2.2 の新機能なので、Ruby 2.1 では使えません。 -- [田中 哲][たなか あきら][Tanaka Akira]