本文へジャンプ

【障害情報】IBM Java SDK 1.4.2のjava.math.BigDecimalが一部の計算結果を誤る不具合(WAS-09-00B)

【重要情報】IBM Java SDK 1.4.2 (以下、IBM JDK 1.4.2) の環境で、java.math.BigDecimalを使用し特定処理を実行した場合に誤った結果が戻る場合があります。

内容/目次

【障害概要】

IBM Java SDK 1.4.2 (以下、IBM JDK 1.4.2) の環境で、java.math.BigDecimalを使用し特定処理を実行した場合に誤った結果が戻る場合があります。


【対象ソフトウェア】
IBM JDK 1.4.2のSR13以前のService Releaseを使用している場合に当問題が発生する可能性があります。
WebSphere Application Server (以下、WAS)ではV5.1.1、V6.0が対象となります。
(WAS V5.1.0は IBM JDK 1.4.1を使用しているため、該当しません)


【対象オペレーティング・システム】

  • AIX、Linux、Windows、z/OS (32bit版、64bit版)、i5/OS(※)

IBM JDKのみで発生する問題のため、Sun Java SDKを使用するOS(SolarisやHP-UX)では発生しません。


※ i5/OS環境の場合は以下の限定的な環境においてのみ発生します。しかし、WAS環境においてはこの障害は該当しません。
5722-JV1/5761-JV1オプション 6のJDK 1.4では、当問題は発生しません。IBM i 6.1には PTF SI32444 で5761-JV1 オプション 13でもJDK1.4が提供されます。
PTFを適用し、オプション 13を使うようお客様で設定されている場合は、当問題が発生する可能性があります。
なお、WASを含め、通常のIBM製品は、オプション 13のJDKを利用しません。JDK 1.4を利用する場合、オプション 6を利用します。
オプション 13が導入されていても、これらのアプリケーションに当問題は発生しません。


【発生条件】
上記対象となっているJDK上で、java.math.BigDecimalを使用し、以下の2つの条件が満たされる処理を実行した場合、誤った結果が戻る可能性があるという問題が、APAR PK87098にて報告されています。実行結果として例外がスローされず、誤った計算結果が戻る可能性があります。com.ibm.math.BigDecimalクラスを使用した場合にはこの問題は発生しません。

(条件1)
BigDecimalの値をsetScale()またはdivide()でroundingModeをROUND_HALF_UPないしはROUND_HALF_EVENとする処理を実行
(条件2)
setScale()またはdivide()のScaleにて切り落とされる桁数が18桁の場合
例1) 0.930000000000000000をsetScale(0,BigDecimal.ROUND_HALF_UP)で処理
例2) 0.9300000000000000000をsetScale(1,BigDecimal.ROUND_HALF_UP)で処理

(例)
public class Simple {
public static void main(String[] args) {
BigDecimal temp = new BigDecimal("0");
BigDecimal result = new BigDecimal("0");
BigDecimal bd1 = new BigDecimal("0.02105839");
BigDecimal bd2 = new BigDecimal("47.4870000000");
temp = bd1.multiply(bd2);
result = temp.setScale( 0, BigDecimal.ROUND_HALF_UP );
System.out.println("result = " + result);
}
}

上記はあくまで一例ですが、setScale()の結果として期待されるものは1であるにも関わらず、resultにて-1が戻ります。
※演算結果の小数点以下の値によって、問題が発生する場合としない場合があります。




【確認方法】
java -version コマンドを使用します。
WASの場合は、必ずWASに同梱されているjavaディレクトリのjavaコマンドを使用して確認してください。

(例) UNIX環境のWAS V6.0の場合

# /usr/IBM/WebSphere/AppServer/java/jre/bin/java -version
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2)
Classic VM (build 1.4.2, J2RE 1.4.2 IBM AIX build ca142ifx-20070604 (ifix 120916 : 142_SR8 + 119825) (JIT enabled: jitc))

上記は IBM JDK 1.4.2 SR8 です。
※z/OSにつきましては、SMP、またはJOBLOGで製品のレベルを確認してください。


【回避策】
ありません。


【対応策】
APAR PK87098に対する修正を含むIBM JDK1.4.2 のリリース(SR、Fix Pack)を適用してください。
2009年6月24日現在、修正を含むリリースは出荷されておりません。
Interim Fix入手のご要望、またはご質問は、サポート契約(ソフトウェア・サブスクリプション&サポート、またはSTSS)に基づくサポート窓口までお問い合わせください。

<分散系OS上のWASの場合>
APAR PK87098はIBM JDK1.4.2 の次期リリースに含まれます。
2009年12月中旬にSR13-3 (SR13 Fixpack 3) に含まれる予定です。
WAS V5.1.1およびV6.0に適用可能なIBM JDKの最新Fix Pack情報は、下記URLをご参照ください。


<z/OS上のWASの場合>
APAR PK87098はIBM SDK1.4.2 の次期リリースに含まれます。
2009年12月中旬にSR13-3 (SR13 Fixpack 3) に含まれる予定です。
z/OS版SDKの最新Fix Pack情報は、下記URLをご参照ください。 <i5/OS上の該当するJava環境の場合>
サービス契約のあるお客様はIBMサービス・ラインにお問い合わせください。
    【お問合せ先】
    技術的な内容に関して、サービス契約のあるお客様はIBMサービス・ラインにお問い合わせください。
    IBMサービス・ライン



    【変更履歴】
    2009年06月25日 【対象オペレーティング・システム】の項目において、i5/OSの説明を修正しました。
    2009年07月15日 【対応策】の項目において修正を含むFixのバージョンがSR13-1からSR13-2に変更になりました。これに伴い、出荷時期も2009年7月末から2009年10月末(予定)に記載を変更しました。
    2009年07月27日 【対応策】の項目においてz/OS上のWASの場合においてもFix出荷時期をSR13-2に改めました。
    2009年10月05日 【発生条件】の項目において、修正・加筆しました。
    2009年11月09日 【対応策】の項目において修正を含むFixのバージョンがSR13-2からSR13-3に変更になりました。これに伴い、出荷時期も2009年12月中旬(予定)に記載を変更しました。

    文書情報

    有効期限: 2017年6月8日
    資料番号: ywa00002

    掲載内容について

    当サイトは、お客様の問題解決のためのヒントとしてご利用ください。 当サイトにおける記載内容は、お客様固有の問題に対し、適切であるかどうか、また、正確であるかどうかは十分検証されていません。 結果について、いかなる保証も責任も負いかねますので、あらかじめご了承ください。

    商標について

    IBM、IBM(logo)、developerWorks、Lotus、PartnerWorld、Rational、Tivoli、 WebSphereはIBM Corporationの商標です。 他の会社名、製品名およびサービス名等はそれぞれ各社の商標です。

    ソフトウェアサポート

    ソフトウェア製品のサポート技術情報

    ハードウェアサポート

    ハードウェア製品のサポート技術情報