SalesforceにおけるDecimalとは?
SalesforceにおけるDecimalとは、Salesforceを機能拡張する際に使われるApex言語において、小数点を含む任意の精度数の数値を扱うプリミティブデータ型です。
また、通貨項目にはDecimal型が自動的に割り当てられます。
Decimalの概要
SalesforceのApex言語には、小数点を含む数値を扱うプリミティブデータ型にDoubleとDecimalがあります。Doubleと比べDecimalは扱える小数部の範囲が広く、多くのメソッドや様々な数値の丸め方が用意されています。
丸めモード
「CEILING」「FLOOR」「DOWN」「UP」「HALF_DOWN」「HALF_EVEN」「HALF_UP」「UNNECESSARY」の8つのモードがあります。
ここではそれぞれの説明と、各モードで整数に丸めた場合の例を紹介します。
CEILING, FLOOR
正の無限大に丸めるのがCEILING、負の無限大に丸めるのがFLOORです。
例)
入力値:3.5, 2.1, -1.1, -6.5
CEILINGモードの結果:4, 3, -1, -6
FLOORモードの結果:3, 2, -2, -7
DOWN, UP
DOWNは0方向に丸め、UPは0から遠い方向に丸めます。
例)
入力値:3.5, 2.1, -1.1, -6.5
DOWNモードの結果:3, 2, -1, -6
UPモードの結果:4, 3, -2, -7
HALF_DOWN, HALF_EVEN, HALF_UP
最も近い近似値に丸められます。2つの近似値が同じ距離にある場合、HALF_DOWNは0に近い方向へ、HALF_EVENは偶数の近似値に、HALF_UPは0から遠い方向に丸められます。
例)
入力値:3.5, 2.1, -1.1, -6.5
HALF_DOWNモードの結果:3, 2, -1, -6
HALF_EVENモードの結果:4, 2, -1, -6
HALF_UPモードの結果:4, 2, -1, -7
UNNECESSARY
丸める必要がない場合は少数部分(スケールを指定した場合はそれより小さい桁の部分)を切り捨てた値を返し、丸める必要がある場合、例えば5.5などでこのモードが指定されると、MathExceptionが発生します。
例)
入力値:1.0, -1.0, 5.5
UNNECESSARYモードの結果:1, -1, MathException
Decimalのメソッド
プリミティブデータ型であるDecimalのメソッドには、他のデータ型に変換するものや指定したデータ型の値を含むdecimalを返すもの、丸められた近似値を返すものなどが用意されています。
それらについて紹介していきます。
abs()
decimalの絶対値を返します。
戻り値の型:Decimal
Decimal decimalNum = -3.05443;
System.assertEquals(3.05443, decimalNum.abs());
divide(divisor, scale)
decimalをdivisorで指定した除数で除算し、scaleで指定したスケール(小数点以下の桁数)を設定します。丸めモードを指定するdivide(divisor, scale, roundingMode)も、ここで説明します。
divisorの型:Decimal
scaleの型:Integer
roundingModeの型:System.RoundingMode
戻り値の型:Decimal
Decimal decimalNum = 17.2;
Decimal result1 = decimalNum.divide(1000, 3);
System.assertEquals(0.017, result1);
Decimal result2 = decimalNum.divide(1000, 3, System.RoundingMode.UP);
System.assertEquals(0.018, result2);
doubleValue(), intValue(), longValue()
decimalのdouble値、int値、long値をそれぞれ返します。
Decimal decimalNum = 210.123456789012345678;
Double doubleNum = decimalNum.doubleValue();
System.debug(doubleNum); // 210.12345678901235
Integer intNum = decimalNum.intValue();
System.debug(intNum); // 210
Long longNum = decimalNum.longValue();
System.debug(longNum); // 210
format()
コンテキストユーザのロケールを使用して、decimalのstring値を返します。ユーザが設定した地域に合った表示形式になります。
// 日本の場合
Decimal decimalNum = 1234.56789;
system.debug(decimalNum.format()); // 1,234.568
pow(exponent)
decimalを、指定されたexponentの値まで累乗した値を返します。exponentが0の場合、1を返します。
exponentの型:Integer
exponentの値は0~32,767です。
戻り値の型:Decimal
Decimal decimalNum = 43.21;
Decimal powDecimalNum = decimalNum.pow(2);
System.debug(powDecimalNum); // 1867.1041
precision()
decimalの桁数の合計を返します。
戻り値:Integer
Decimal decimalNum = 123.456;
Integer intNum = decimalNum.precision();
System.assertEquals(6, intNum);
round()
decimalの小数部を丸めた近似値を返します。丸めモードを指定するround(roundingMode)も、ここで説明します。
パラメータが指定されない場合、数値はHALF_EVENモードで丸められます。
roundingModeの型:System.RoundingMode
戻り値の型:Long
Decimal dNum = 2.5;
Long lNum1 = dNum.round();
System.assertEquals(2, lNum1);
Long lNum2 = dNum.round(System.RoundingMode.UP);
System.assertEquals(3, lNum2);
scale()
小数部の桁数を返します。
戻り値の型:Integer
Decimal decimalNum = 0.123456789;
System.assertEquals(9, decimalNum.scale());
setScale(scale)
HALF_EVENモードを使用し、指定されたスケールへ丸められます。また、丸めモードを指定するsetScale(scale, roundingMode)についても、ここで説明します。
scaleの型:Integer
scaleの値の範囲は、-33~33です。scaleが-2のときは、整数の2桁目が丸められます。
roundingModeの型:System.RoundingMode
戻り値の型:Decimal
Decimal decimalNum = 1201.59263487;
Decimal setScaledNum1 = decimalNum.setScale(3);
System.assertEquals(1201.593, setScaledNum1);
Decimal setScaledNum2 = decimalNum.setScale(3, System.RoundingMode.DOWN);
System.assertEquals(1201.592, setScaledNum2);
stripTrailingZeros()
末尾の0が削除されたdecimalを返します。
戻り値の型:Decimal
Decimal decimalNum = 1.0100;
System.assertEquals(1.01, decimalNum.stripTrailingZeros());
toPlainString()
科学的記数法を用いずに、decimalのstring値を返します。科学的記数法とは、「1.08×10^23」のような書き方のものです。
Decimal decimalNum = 123.456;
System.assertEquals('123.456', decimalNum.toPlainString());
valueOf(doubleToDecimal)
指定したdoubleの値を含むdecimalを返します。他にもvalueOf(longToDecimal)やvalueOf(stringToDecimal)があります。あわせてここで説明します。
doubleToDecimalの型:Double
longToDecimalの型:Long
stringToDecimalの型:String
戻り値:Decimal
Double doubleNum = 1.732;
System.assertEquals(1.732, Decimal.valueOf(doubleNum));
Long longNum = 12345;
System.assertEquals(12345, Decimal.valueOf(longNum));
String strNum = '123.456';
System.assertEquals(123.456, Decimal.valueOf(strNum));
Decimalを活用しよう!
本記事では、SalesforceにおけるDecimalについて紹介しました。
Decimalは小数部を持つ数値に対して多くのメソッドを持ち、様々な丸め方を用意しています。Salesforceの機能拡張時に、是非活用できるようにしておきましょう。]]>