SalesforceのDecimalクラスの罠:Excelとの違いにご注意を!

ノーコード/ローコード

はじめに

Salesforceでのプログラミングにおいて、Decimalクラスは欠かせない存在です。通貨計算や小数点以下の正確な演算を行うのに便利ですが、このDecimalクラスが思わぬ結果を生むことがあるのをご存じでしょうか?

特に、Excelでの計算結果と異なる挙動を示す場合、開発者を困惑させることがあります。本記事では、Decimalクラスの特性やExcelとの違い、そしてその回避策について詳しく解説します。


問題例:Excelと異なる計算結果

以下のコードを見てみましょう:

Decimal value = 10 / 3 * 3;  
System.debug(value);

Salesforceでの結果
9

一方、Excelで同じ計算を行った場合:

=10/3*3

Excelでの結果
10


違いの原因:中間結果の丸め処理

Salesforceの計算フロー

  1. 10 / 33.333…
  2. 中間結果を自動で丸める(デフォルトではスケール設定なし)。結果は3
  3. 3 * 39

Excelの計算フロー

  1. 10 / 33.333…(丸めなし)
  2. 3.333... * 310

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の違いを理解し、計算結果を制御するためには以下を意識しましょう:

  1. 丸め処理を制御setScale()を活用して中間結果の精度を保証。
  2. 計算順序を工夫:除算を後回しにして丸めを回避。
  3. 用途に応じた型を選択:精度が重要な場合はDecimal型を優先。

おわりに

SalesforceのDecimalクラスは、正確な計算を行う上で非常に便利なツールですが、その特性を理解しないと意図しないバグを引き起こす可能性があります。今回紹介した注意点と解決策を活用し、計算に潜む罠を回避しましょう!

もしこの記事が役に立ったと感じたら、SNSでシェアしてください。他の開発者仲間が同じ罠にハマらないよう、知識を共有しましょう。

「正確な計算は、正しい理解から!」

コメント

タイトルとURLをコピーしました