プログラマ38の日記

主にプログラムメモです。

Salesforce: Decimal.round()とDecimal.setScale()は、RoundingModeを指定しないとHALF_EVENです

1円の単位で金額がおかしくなる現象が発生

Decimalのroundは引数を指定しないと、HALF_EVENでした。

RoundingMode.HALF_UPを引数で指定しないと四捨五入になりませんでした。

横着してはいけないですね。。

 

以下RoundingMode別のround後の値です。

 

RoudingMode
指定無 HALF_EVEN HALF_UP HALF_DOWN CEILING FLOOR UP DOWN
2.5 2 2 3 2 3 2 3 2
3.5 4 4 4 3 4 3 4 3
-2.5 -2 -2 -3 -2 -2 -3 -3 -2
-3.5 -4 -4 -4 -3 -3 -4 -4 -3

 

 また、setScaleも同様にRoundingModeを指定しないと、HALF_EVENです。

Decimal num1 =   0.25;
Decimal num2 =   0.35;

System.debug( num1.setscale(1) );
System.debug( num2.setscale(1) );

 上記の結果は、

num1: 0.2
num2: 0.4

 となるので、setScaleの際も、RoundingModeは省略しないで書く必要があります。

num1.setscale(1,RoundingMode.HALF_UP)