小数から整数への変換について
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