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] |
翻訳元
これは以下のページを翻訳したものです。
NUM11-J. Do not compare or inspect the string representation of floating-point values (revision 83)
