はじめに
Salesforceでのプログラミングにおいて、Decimal
クラスは欠かせない存在です。通貨計算や小数点以下の正確な演算を行うのに便利ですが、このDecimal
クラスが思わぬ結果を生むことがあるのをご存じでしょうか?
特に、Excelでの計算結果と異なる挙動を示す場合、開発者を困惑させることがあります。本記事では、Decimal
クラスの特性やExcelとの違い、そしてその回避策について詳しく解説します。
問題例:Excelと異なる計算結果
以下のコードを見てみましょう:
Decimal value = 10 / 3 * 3;
System.debug(value);
Salesforceでの結果:9
一方、Excelで同じ計算を行った場合:
=10/3*3
Excelでの結果:10
違いの原因:中間結果の丸め処理
Salesforceの計算フロー
10 / 3
→ 3.333…- 中間結果を自動で丸める(デフォルトではスケール設定なし)。結果は3。
3 * 3
→ 9
Excelの計算フロー
10 / 3
→ 3.333…(丸めなし)3.333... * 3
→ 10
Excelは中間結果を保持したまま計算を進めるため、期待通りの結果が得られます。一方、SalesforceのDecimal
クラスは中間結果を丸める仕様があり、この違いが予期せぬ結果を招く原因となります。
解決策:正しいスケール設定
Salesforceで正しい結果を得るには、Decimal
クラスのsetScale()
メソッドを使用し、丸め処理を制御する必要があります。
修正版コード
Decimal myDecimal = 10; // 初期値設定
Decimal result = ((myDecimal / 3).setScale(10, RoundingMode.HALF_UP) * 3).setScale(2, RoundingMode.HALF_UP);
System.debug('計算結果: ' + result); // 結果: 10.00
ポイント:
setScale()
で中間結果の精度を指定。RoundingMode.HALF_UP
で丸め方を明示。
浮動小数点型(Double)の場合
Double
型を使用すると丸め処理の影響を受けにくくなりますが、これも注意が必要です。
コード例
Double value = 10 / 3 * 3;
System.debug(value);
結果:9
Double
型も中間結果で精度が損なわれる場合があり、通貨計算や高精度が必要な場面では不向きです。
ポイントまとめ
SalesforceのDecimal
クラスとExcelの違いを理解し、計算結果を制御するためには以下を意識しましょう:
- 丸め処理を制御:
setScale()
を活用して中間結果の精度を保証。 - 計算順序を工夫:除算を後回しにして丸めを回避。
- 用途に応じた型を選択:精度が重要な場合は
Decimal
型を優先。
おわりに
SalesforceのDecimal
クラスは、正確な計算を行う上で非常に便利なツールですが、その特性を理解しないと意図しないバグを引き起こす可能性があります。今回紹介した注意点と解決策を活用し、計算に潜む罠を回避しましょう!
もしこの記事が役に立ったと感じたら、SNSでシェアしてください。他の開発者仲間が同じ罠にハマらないよう、知識を共有しましょう。
「正確な計算は、正しい理解から!」
コメント