JPCERT コーディネーションセンター

NUM11-J. 浮動小数点数の文字列表現を比較したり内容を調べたりしない

NUM11-J. 浮動小数点数の文字列表現を比較したり内容を調べたりしない

浮動小数点数の文字列表現を比較したり、その内容を調べたりするべきではない。もしするなら、期待する動作が確実になるよう細心の注意を払う必要がある。

違反コード (文字列の比較)

以下の違反コードでは、1/10000.0から得た10進小数文字列の比較を誤っている。文字列は0.0001ではなく1.0E-4になる。

int i = 1;
String s = Double.valueOf(i / 10000.0).toString();
if (s.equals("0.0001")) {
  // ...
}
適合コード (文字列の比較)

以下の適合コードでは、BigDecimalクラスを使用して指数表記への変換を防いでいる。数値の比較も想定した通りに行われる。

int i = 1;
BigDecimal d = new BigDecimal(Double.valueOf(i / 10000.0).toString());
if (d.compareTo(new BigDecimal("0.0001")) == 0) {
  // ...
}
リスク評価

浮動小数点数の文字列表現を比較したり内容を調べたりすると、予期せぬ結果が得られる場合がある。

ルール

深刻度

可能性

自動検出

自動修正

優先度

レベル

NUM11-J

P9

L2

実装の詳細 (Android)

Androidでも、浮動小数点数の文字列表現を比較したり内容を調べたりすると、予期せぬ結果が得られる場合がある。

参考文献

[API 2006]


[JLS 2015]


[Seacord 2015] Image result for video icon NUM11-J. Do not compare or inspect the string representation of floating-point values LiveLesson
翻訳元

これは以下のページを翻訳したものです。

NUM11-J. Do not compare or inspect the string representation of floating-point values (revision 83)

Top へ

Topへ
最新情報(RSSメーリングリストTwitter