小数から整数への変換について

PowerShell では [int] をつかって、小数から整数に値を丸めます。この丸め仕様は C / C++ / C# における int キャストと同じかどうか検証します。

結論からいうと PowerShell の [int] は JIS 丸めです。.NET Framework の Math.Round と同じです。C / C++ / C# の int キャストとは違います。

それ以外にも Math.Floor と Math.Truncate というメソッドもありますので、同時に検証します。

正の小数の整数変換

$arr = @()
$arr_i = @()
$arr_r = @()
$arr_f = @()
$arr_t = @()

# 正の値を格納する.
for ( $n = +100; $n -le +200; $n++ )
{
    $value = $n * 0.1
    $arr += $value
}

foreach ( $item in $arr )
{
    $arr_i += [int]( $item )
    $arr_r += [Math]::Round( $item )
    $arr_f += [Math]::Floor( $item )
    $arr_t += [Math]::Truncate( $item )
}

$str = "ORG`tI`tR`tF`tT" + "`n" 

for ( $n = 0; $n -lt $arr.Length; $n++ )
{
    $v0 = $arr[$n]
    $v1 = $arr_i[$n]
    $v2 = $arr_r[$n]
    $v3 = $arr_f[$n]
    $v4 = $arr_t[$n]
    $str += "{0:f1}`t{1}`t{2}`t{3}`t{4}`n" -f $v0, $v1, $v2, $v3, $v4
} 

Write-Host( $str )

Write-Host( "finish" )

実行結果です。[int] と Round は同じです。切り下げの Floor と Truncate の結果は同じになります。

ORG	I	R	F	T
10.0	10	10	10	10
10.1	10	10	10	10
10.2	10	10	10	10
10.3	10	10	10	10
10.4	10	10	10	10
10.5	10	10	10	10
10.6	11	11	10	10
10.7	11	11	10	10
10.8	11	11	10	10
10.9	11	11	10	10
11.0	11	11	11	11
11.1	11	11	11	11
11.2	11	11	11	11
11.3	11	11	11	11
11.4	11	11	11	11
11.5	12	12	11	11
11.6	12	12	11	11
11.7	12	12	11	11
11.8	12	12	11	11
11.9	12	12	11	11
12.0	12	12	12	12
12.1	12	12	12	12
12.2	12	12	12	12
12.3	12	12	12	12
12.4	12	12	12	12
12.5	12	12	12	12
12.6	13	13	12	12
12.7	13	13	12	12
12.8	13	13	12	12
12.9	13	13	12	12
13.0	13	13	13	13
13.1	13	13	13	13
13.2	13	13	13	13
13.3	13	13	13	13
13.4	13	13	13	13
13.5	14	14	13	13
13.6	14	14	13	13
13.7	14	14	13	13
13.8	14	14	13	13
13.9	14	14	13	13
14.0	14	14	14	14
14.1	14	14	14	14
14.2	14	14	14	14
14.3	14	14	14	14
14.4	14	14	14	14
14.5	14	14	14	14
14.6	15	15	14	14
14.7	15	15	14	14
14.8	15	15	14	14
14.9	15	15	14	14
15.0	15	15	15	15
15.1	15	15	15	15
15.2	15	15	15	15
15.3	15	15	15	15
15.4	15	15	15	15
15.5	16	16	15	15
15.6	16	16	15	15
15.7	16	16	15	15
15.8	16	16	15	15
15.9	16	16	15	15
16.0	16	16	16	16
16.1	16	16	16	16
16.2	16	16	16	16
16.3	16	16	16	16
16.4	16	16	16	16
16.5	16	16	16	16
16.6	17	17	16	16
16.7	17	17	16	16
16.8	17	17	16	16
16.9	17	17	16	16
17.0	17	17	17	17
17.1	17	17	17	17
17.2	17	17	17	17
17.3	17	17	17	17
17.4	17	17	17	17
17.5	18	18	17	17
17.6	18	18	17	17
17.7	18	18	17	17
17.8	18	18	17	17
17.9	18	18	17	17
18.0	18	18	18	18
18.1	18	18	18	18
18.2	18	18	18	18
18.3	18	18	18	18
18.4	18	18	18	18
18.5	18	18	18	18
18.6	19	19	18	18
18.7	19	19	18	18
18.8	19	19	18	18
18.9	19	19	18	18
19.0	19	19	19	19
19.1	19	19	19	19
19.2	19	19	19	19
19.3	19	19	19	19
19.4	19	19	19	19
19.5	20	20	19	19
19.6	20	20	19	19
19.7	20	20	19	19
19.8	20	20	19	19
19.9	20	20	19	19
20.0	20	20	20	20

finish

負の小数の整数変換

つぎに、負の値の場合、[int]、Round、Floor、Truncate、はどうなるか下記のコードで検証してみます。

$arr = @()
$arr_i = @()
$arr_r = @()
$arr_f = @()
$arr_t = @()

# 負の値を格納する.
for ( $n = -100; $n -ge -200; $n-- )
{
    $value = $n * 0.1
    $arr += $value
}

foreach ( $item in $arr )
{
    $arr_i += [int]( $item )
    $arr_r += [Math]::Round( $item )
    $arr_f += [Math]::Floor( $item )
    $arr_t += [Math]::Truncate( $item )
}

$str = "ORG`tI`tR`tF`tT" + "`n" 

for ( $n = 0; $n -lt $arr.Length; $n++ )
{
    $v0 = $arr[$n]
    $v1 = $arr_i[$n]
    $v2 = $arr_r[$n]
    $v3 = $arr_f[$n]
    $v4 = $arr_t[$n]
    $str += "{0:f1}`t{1}`t{2}`t{3}`t{4}`n" -f $v0, $v1, $v2, $v3, $v4
} 

Write-Host( $str )

Write-Host( "finish" )

下記が、負の小数から整数変換の実行結果です。[int] と Round は同じです。Floor と Truncate の値が違うことに注目してください。

ORG	I	R	F	T
-10.0	-10	-10	-10	-10
-10.1	-10	-10	-11	-10
-10.2	-10	-10	-11	-10
-10.3	-10	-10	-11	-10
-10.4	-10	-10	-11	-10
-10.5	-10	-10	-11	-10
-10.6	-11	-11	-11	-10
-10.7	-11	-11	-11	-10
-10.8	-11	-11	-11	-10
-10.9	-11	-11	-11	-10
-11.0	-11	-11	-11	-11
-11.1	-11	-11	-12	-11
-11.2	-11	-11	-12	-11
-11.3	-11	-11	-12	-11
-11.4	-11	-11	-12	-11
-11.5	-12	-12	-12	-11
-11.6	-12	-12	-12	-11
-11.7	-12	-12	-12	-11
-11.8	-12	-12	-12	-11
-11.9	-12	-12	-12	-11
-12.0	-12	-12	-12	-12
-12.1	-12	-12	-13	-12
-12.2	-12	-12	-13	-12
-12.3	-12	-12	-13	-12
-12.4	-12	-12	-13	-12
-12.5	-12	-12	-13	-12
-12.6	-13	-13	-13	-12
-12.7	-13	-13	-13	-12
-12.8	-13	-13	-13	-12
-12.9	-13	-13	-13	-12
-13.0	-13	-13	-13	-13
-13.1	-13	-13	-14	-13
-13.2	-13	-13	-14	-13
-13.3	-13	-13	-14	-13
-13.4	-13	-13	-14	-13
-13.5	-14	-14	-14	-13
-13.6	-14	-14	-14	-13
-13.7	-14	-14	-14	-13
-13.8	-14	-14	-14	-13
-13.9	-14	-14	-14	-13
-14.0	-14	-14	-14	-14
-14.1	-14	-14	-15	-14
-14.2	-14	-14	-15	-14
-14.3	-14	-14	-15	-14
-14.4	-14	-14	-15	-14
-14.5	-14	-14	-15	-14
-14.6	-15	-15	-15	-14
-14.7	-15	-15	-15	-14
-14.8	-15	-15	-15	-14
-14.9	-15	-15	-15	-14
-15.0	-15	-15	-15	-15
-15.1	-15	-15	-16	-15
-15.2	-15	-15	-16	-15
-15.3	-15	-15	-16	-15
-15.4	-15	-15	-16	-15
-15.5	-16	-16	-16	-15
-15.6	-16	-16	-16	-15
-15.7	-16	-16	-16	-15
-15.8	-16	-16	-16	-15
-15.9	-16	-16	-16	-15
-16.0	-16	-16	-16	-16
-16.1	-16	-16	-17	-16
-16.2	-16	-16	-17	-16
-16.3	-16	-16	-17	-16
-16.4	-16	-16	-17	-16
-16.5	-16	-16	-17	-16
-16.6	-17	-17	-17	-16
-16.7	-17	-17	-17	-16
-16.8	-17	-17	-17	-16
-16.9	-17	-17	-17	-16
-17.0	-17	-17	-17	-17
-17.1	-17	-17	-18	-17
-17.2	-17	-17	-18	-17
-17.3	-17	-17	-18	-17
-17.4	-17	-17	-18	-17
-17.5	-18	-18	-18	-17
-17.6	-18	-18	-18	-17
-17.7	-18	-18	-18	-17
-17.8	-18	-18	-18	-17
-17.9	-18	-18	-18	-17
-18.0	-18	-18	-18	-18
-18.1	-18	-18	-19	-18
-18.2	-18	-18	-19	-18
-18.3	-18	-18	-19	-18
-18.4	-18	-18	-19	-18
-18.5	-18	-18	-19	-18
-18.6	-19	-19	-19	-18
-18.7	-19	-19	-19	-18
-18.8	-19	-19	-19	-18
-18.9	-19	-19	-19	-18
-19.0	-19	-19	-19	-19
-19.1	-19	-19	-20	-19
-19.2	-19	-19	-20	-19
-19.3	-19	-19	-20	-19
-19.4	-19	-19	-20	-19
-19.5	-20	-20	-20	-19
-19.6	-20	-20	-20	-19
-19.7	-20	-20	-20	-19
-19.8	-20	-20	-20	-19
-19.9	-20	-20	-20	-19
-20.0	-20	-20	-20	-20

finish