【Salesforce】ApexでDecimalをMapのKeyにした際の動き

【Salesforce】ApexでDecimalをMapのKeyにした際の動き

SalesforceのMapでKeyにDecimal型を設定して値を取得しようとしたところ、意図しない挙動をしたのでメモです。

動きとしては、「10」でも「10.0」でも「+10.00」を返してくれると思っていました。

ところが、実際の動きとしては小数点以下の桁数まで一致しているもののみ、Keyが一致しているということになりました。

// Decimalの値からStringの値を取得するMap
Map<Decimal, String> getStrMap = new Map<Decimal, String>();

getStrMap.put(10, '+10.00');


system.debug(getStrMap.containsKey(10));        // true

system.debug(getStrMap.get(10));                // +10.00

system.debug(getStrMap.containsKey(10.0));      // false

system.debug(getStrMap.get(10.0));              // null

system.debug(getStrMap.containsKey(10.00));     // false

system.debug(getStrMap.get(10.00));             // null

Keyの型をDecimalからDoubleに直すことで解決することができました。

// Decimalの値からStringの値を取得するMap
Map<Decimal, String> getStrMap = new Map<Decimal, String>();

getStrMap.put(10, '+10.00');


system.debug(getStrMap.containsKey(10));    // true

system.debug(getStrMap.get(10));            // +10.00

system.debug(getStrMap.containsKey(10.0));  // false

system.debug(getStrMap.get(10.0));          // null

system.debug(getStrMap.containsKey(10.00)); // false

system.debug(getStrMap.get(10.00));         // null

Decimal型は小数点以下の桁数まで保持しているということでしょうか。

一応、こんな確認もしてみました。

Decimal a = 10;

Decimal b = 10.0;

Decimal c = 10.00;


system.debug(a);         // 10

system.debug(b);         // 10.0

system.debug(c);         // 10.00

system.debug((double)a); // 10.0

system.debug((double)b); // 10.0

system.debug((double)c); // 10.0

何にしても、注意しなければいけないことはわかりました。

そもそも、MapのKeyにInteger以外の数値を使うのもあまり良くないのかもしれませんね。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です