内容/目次
IBM Java SDK 5.0 (以下、IBM JDK 5.0) の環境で、java.math.BigDecimalを使用しsubtract()メソッドによる処理を実行した場合に誤った結果が戻る可能性があります。(APAR IZ29093)
BigDecimal.subtract()メソッドの内部処理(桁あふれ(overflow)判定ロジック)に起因する問題ですが、例外はスローされないため注意が必要です。
【対象ソフトウェア】
対象製品: IBM JDK 5.0、またはそれを含むIBMのソフトウェア(WAS V6.1 など)
対象プラットフォーム: AIX、Linux、Windows、z/OS 、i5/OS(※1)
対象バージョン・レベル: IBM JDK 5.0 SR5 以上 SR9未満(※2)(※3)
※1 IBM JDKのみで発生する問題のため、IBM JDKが提供されていないSolarisやHP-UXは対象外です。32bit/64bitなどOSやIBM JDKのbit数には依存しません。
※2 IZ29093 作成当初はSR6aで当問題が報告されましたが、その後SR5以降で当問題が発生する可能性があることを確認済みです。
※3 WAS V6.1 出荷時のIBM JDK 5.0 のバージョンはSR2 のため当問題は発生しません。アプリケーション・サーバーおよびJDK 用Fix Pack は個別に提供されているため、【確認方法】をご参照の上、該当バージョンであるかをご確認ください。
【発生条件】
subtract()メソッドに渡す数値の符号が反対の場合に発生する可能性があります。
subtract()メソッドに渡す数値の符号が同じ場合は発生しません。
そのため発生条件は次の通りです。
(1) 対象ソフトウェアを使用
(2) BigDecimal.subtract()メソッドへの入力値の符号(正負)が反対
例えば以下の例で、期待値は 9819.901800981991000 ですが、誤った結果として -8626.842272727560616 が戻ります。
import java.math.BigDecimal;
public class Test {
public static void main(String[] args) {
BigDecimal A = new BigDecimal("9000");
BigDecimal B = new BigDecimal("-819.901800981991000");
BigDecimal C = A.subtract(B);
System.out.println(C);
}
}
【確認方法】
java -version コマンドを使用してIBM JDKのバージョンを確認してください。
※ WASの場合は、必ずWASに同梱されているjavaディレクトリのjavaコマンドを使用して確認してください。
(例) UNIX環境のWAS V6.1の場合
# /opt/IBM/WebSphere/AppServer/java/bin/java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pxi32dev-20081129 (SR9-0))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Linux x86-32 j9vmxi3223-20081129 (JIT enabled)
J9VM - 20081126_26240_lHdSMr
JIT - 20081112_1511ifx1_r8
GC - 200811_07)
JCL - 20081128
上記は IBM JDK 5.0 SR9 です。
【回避策】
なし
【対応策】
APAR IZ29093 に対する修正を含むIBM JDK5.0 のリリース(SR、Fix Pack)を適用してください。
Interim Fix入手のご要望、またはご質問は、サポート契約(ソフトウェア・サブスクリプション&サポート、またはSTSS)に基づくサポート窓口までお問い合わせください。
<分散系OS上のWASの場合>
APAR IZ29093 は 20080814以降のビルド (IBM JDK5.0 SR8a以上) に含まれます。
WAS V6.1に適用可能なIBM JDKの最新Fix Pack情報は、下記URLをご参照ください。
WAS V6.1
[Recommended fixes for WebSphere Application Server]
http://www.ibm.com/support/docview.wss?rs=180&uid=swg27004980
<z/OS上のWASの場合>
APAR IZ29093は20080814以降のビルド (IBM JDK5.0 SR8a以上) に含まれます。
z/OS版SDKの最新Fix Pack情報は、下記URLをご参照ください。
[Java on the z/OS and OS/390 Platforms]
http://www.ibm.com/servers/eserver/zseries/software/java/
<i5/OS上の該当するJava環境の場合>
57xx-JV1 Option 8または9(J9 JDK)をご利用の場合:
SR9以上で修正を確認済みです。SR9未満は最新のJavaグループPTFを適用してください。(V6R1の場合 SF99562、V5R4の場合 SF99291)
57xx-JV1 Option 7(クラッシクJDK)をご利用の場合:
V6R1の場合 SI35712、V5R4の場合 SI35711 のPTFを適用してください。今後、JavaグループPTFに含まれる予定です。
【関連情報】
IZ29093: BIGDECIMAL.SUBTRACT() GIVES UNEXPECTED RESULTS.
http://www.ibm.com/support/docview.wss?rs=203&uid=swg1IZ29093
【お問合せ先】
技術的な内容に関して、サービス契約のもとIBMサービス・ラインにお問い合わせください。
IBMサービス・ライン
【変更履歴】
2009年7月31日 【障害概要】と【対象ソフトウェア】の記載を変更しました。【発生条件】に符号の正負に関する条件を加えて修正しました。
2009年8月12日 i5/OSの【対応策】の記載を更新しました。
文書情報
有効期限: 2017年7月8日
資料番号: ywa00004
掲載内容について
当サイトは、お客様の問題解決のためのヒントとしてご利用ください。 当サイトにおける記載内容は、お客様固有の問題に対し、適切であるかどうか、また、正確であるかどうかは十分検証されていません。 結果について、いかなる保証も責任も負いかねますので、あらかじめご了承ください。
商標について
IBM、IBM(logo)、developerWorks、Lotus、PartnerWorld、Rational、Tivoli、 WebSphereはIBM Corporationの商標です。 他の会社名、製品名およびサービス名等はそれぞれ各社の商標です。
