Javaエバンジェリストがお届けするホットな話題
5分でわかる今週のJava ホットトピック
水曜日 2 28, 2007
今週のJavaクイズ(3) 回答編:ある日の為替レート
さて今回の問題はいかがだったでしょうか? すでにJSPで類似のものを実装されていて経験されている方には簡単だったと思います。

ある日の為替レート

表示されるレートはそれぞれいくらになるでしょうか? その理由もお考えください。

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<body>
米ドル: <fmt:formatNumber pattern="0.00" value="116.265000"/>円 <br />
豪ドル: <fmt:formatNumber pattern="0.00" value="90.584330"/>円 <br />
英ポンド: <fmt:formatNumber pattern="0.00" value="226.01753"/>円
</body>
</html>

回答

今回の問題のポイントはformatNumberによって小数点以下がどのように扱われるかでした。まず、これを実行した結果を見てみましょう。

米ドル: 116.26円
豪ドル: 90.58円
英ポンド: 226.02円

この結果から考えると小数点以下はそれぞれ次のように処理されたように見えます。

  • 米ドルは切り捨て
  • 豪ドルも切り捨てか四捨五入
  • 英ポンドは切り上げか四捨五入

どうして同じフォーマットのパターン 0.00 を使っているのにこのように処理が変わってしまうのでしょうか。これは、formatNumberタグが利用しているフォーマッタが、java.text.DecimalFormatで、小数点以下の処理方法がROUND_HALF_EVENだからです。ROUND_HALF_EVENは仕様によると

 「もっとも近い数字」 に丸めるモードです。ただし、両隣りの数字が等距離の場合は偶数側に丸めます。破棄する小数部の左辺の桁が奇数の場合は ROUND_HALF_UP のように動作し、偶数の場合は ROUND_HALF_DOWN のように動作します。この丸めモードは、連続する計算で繰り返し適用される場合に累積エラーを最小限にします。

 というように、少数部の左辺の桁が奇数なのか、偶数なのかによってそれぞれ動作が異なるため、今回の問題のように結果が分かれた訳です。
 


投稿されたコメント:

コメント
コメントは無効になっています。
過去の記事
« 12月 2009
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  
       
今日
Click me to subscribeこのブログを購読する(RSS)
検索

リンク
 

Today's Page Hits: 54