質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

2219閲覧

roundで四捨五入にならない場合の理由を教えてください

mt_

総合スコア14

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/09/06 09:04

前提・実現したいこと

小数点第三位を四捨五入したいのですが、
rubyのバージョンによっては四捨五入できない場合があります。
ruby2.1で実行した場合に正しく四捨五入できない理由が知りたいです。

ご教授よろしくおねがいいたします。

試したこと

  • ruby2.1で実行した場合
irb(main):001:0> 1024.975.round(2) => 1024.97 irb(main):002:0> 1023.975.round(2) => 1023.98
  • ruby2.4で実行した場合
irb(main):001:0> 1024.975.round(2) => 1024.98 irb(main):002:0> 1023.975.round(2) => 1023.98

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Ruby

1pry(main)> 1024.975 * 100 2=> 102497.49999999999

なので、特別な工夫なく処理すると1024.97になるのが自然な気がします。

half引数が追加されたときに、10進演算の場合に近くなるように、作為的な処理を追加したのではないでしょうか?(ソースまでは確認してませんが)

投稿2019/09/06 23:52

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mt_

2019/09/09 05:47

丁寧に教えて頂きありがとうございます! 解決しました。
guest

0

もともとの ruby (~2.4.0)の Float#round のバグではないかという気もしますが。

ruby の更新履歴を見ると、2.4.0 で round メソッドに half: のキーワード引数が追加され、ちょうど中間値だったときの挙動を設定できるようになっています。この省略時の値が :up(切り上げる)なので、ここで挙動が違ってませんでしょうか。

試しに 2.4 で、

ruby

11024.975.round(2, half: :even) 21024.975.round(2, half: :down)

の結果は

1024.98 1024.97

になりました。

投稿2019/09/06 09:23

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mt_

2019/09/09 05:47

丁寧に教えて頂きありがとうございます! 解決しました。
guest

0

ベストアンサー

ruby2.1 の場合、1024.975 と 1023.975 で繰り上げ繰り下げが異なるのが不思議なのでしょうか。
これはruby(に限らず全ての言語の多くの数値表現が)10進ではなく2進で扱われているため、表示された数値と内部の値が正確に一致しているわけでは無いことに起因しています。

irb(main):003:0> 1024.975 - 1023.975
=> 0.9999999999998863

1024.975 の方が1.000000000000 おおきいのではなく、ちょっと足りません。
実際の値が 1024.9749999。。。。 であるため切り捨てられたということです。

投稿2019/09/06 12:55

winterboum

総合スコア23284

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mt_

2019/09/09 05:47

丁寧に教えて頂きありがとうございます! 解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問