JavaとかPythonのround

2007/06/06 13:27

Pythonのround関数の議論を読んでみた ってあるけど

そもそもPythonで0.0225をプリントしてみなってんだw

(RSSしか見てない人のための追記)

恥ずかしい思いをしたおかげで勉強になった。0.49999999999999999のroundについて、PythonもJavaも正しい動きをしているらしい。

  >>> 0.0225
  0.022499999999999999
  >>> round(0.49999999999999999)
  1.0
  >>> round(0.4999999999999999)
  0.0
  import java.math.BigDecimal;

  public class Test{
      public static void main(String[] args){
          System.out.println("17:" + Math.round(0.49999999999999999d));
          System.out.println("16:" + Math.round(0.4999999999999999d));
          double d = 0.49999999999999999999999999999999d;
          System.out.println("double:" + d);
          BigDecimal bd = new BigDecimal(0.49999999999999999999999999999999d);
          System.out.println("bd double ROUND_HALF_UP:" + bd.setScale(0, BigDecimal.ROUND_HALF_UP));
          bd = new BigDecimal("0.49999999999999999999999999999999");
          System.out.println("bd String ROUND_HALF_UP:" + bd.setScale(0, BigDecimal.ROUND_HALF_UP));
      }
  }

  17:1
  16:0
  double:0.5
  bd double ROUND_HALF_UP:1
  bd String ROUND_HALF_UP:0

Python識者が現れる予感 :-)

2007/06/06 14:06 by hnw
どうも。僕の記事で伝わらなかったとしたら非常に残念ですけど、10進表記で小数点以下第4位を見ていませんか?1000倍して小数点以下第1位を見ないと意味がないですよ?ソースコードも貼ってみたんですけど。
理解しているつもりでもつい10進の常識で考えてしまうのが難しいところですよね。
今まで僕の記事を読んでくださった方には既に伝わっているかと思っていたんですが、なかなか人に物事を伝えるのは難しいものです。このあたりは記事に追記させて頂きます。レスポンスに感謝します。
また、0.49999999999999999はIEEE64bit浮動小数点数だとピッタリ0.5だと思いますよ?
2007/06/06 14:41 by makoto
ごめんなさい。
思いっきり10進数の世界で読んでます。
Pythonが0.0225を保持できないことと、0.49999999999999999を四捨五入すると1になってしまうということを(コンピュータの世界からではなく)、人間の世界から見ています。
が、人間の世界でも0.49999999999999999は四捨五入すると1だよと言われると「ぐぅ」と言います。0.5より小さな数字は四捨五入すると0だという認識しか無いので(ゆとり!?)。
None