HOWTO · PowerShell
PowerShell での数値の丸め方
この記事では、.NET フレームワークの Math クラスの複数の関数を使用して、PowerShell で数値を丸める方法について説明します。
このページの内容
PowerShell には数値の精度を変える方法がいくつかあり、適切な方法は必要な結果によって異なります。小数部分をゼロ方向に取り除くには [Math]::Truncate、方向を指定して丸めるには [Math]::Floor または [Math]::Ceiling、最も近い値に丸めるには [Math]::Round を使います。小数点以下の桁数を指定したり、中間値の丸め方を制御したりするには、[Math]::Round の適切なオーバーロードを使います。
用途に合った丸め方を選ぶ
これらの操作はそれぞれ役割が異なります。切り捨ては小数部分を取り除いてゼロに近づけます。Floor は負の無限大方向へ、ceiling は正の無限大方向へ進みます。最も近い値への丸めには [Math]::Round を使い、既定の中間値ルールは偶数丸めです。書式設定では数値の表示方法だけが変わり、基になる数値そのものは変わらないため、値を整形または表示する前に、目的に合った操作を選びます。
次の例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
$value = 12.34
[Math]::Round($value, 1)
12.3
[Math]::Truncate でゼロ方向に切り捨てる
[Math]::Truncate は小数部分を捨て、ゼロに近づく方向へ進みます。正の入力値では切り下げに似ていますが、負の入力値では数直線上を上方向へ進みます。たとえば、-4.8 を切り捨てると -4 になりますが、Floor では -5 になります。常に負の無限大方向へ進めるのではなく、小数部分を取り除きたい場合に切り捨てを使います。
このセクションのコードと表示されるラベルや出力は英語のままです。
$positive = [Math]::Truncate(4.8)
$negative = [Math]::Truncate(-4.8)
"$positive, $negative"
4, -4
[Math]::Floor で切り下げ、[Math]::Ceiling で切り上げる
[Math]::Floor は入力値以下となる最大の整数を返すため、負の無限大方向へ進みます。[Math]::Ceiling は入力値以上となる最小の整数を返すため、正の無限大方向へ進みます。ここでいう方向は絶対値の大小ではなく、数直線上の向きです。負の数では、Floor はより負の値を返し、ceiling はより負でない値を返すことがあります。
このセクションのコードと表示されるラベルや出力は英語のままです。
$value = -4.2
$down = [Math]::Floor($value)
$up = [Math]::Ceiling($value)
"$down, $up"
-5, -4
[Math]::Round で整数に丸める
[Math]::Round(value) は最も近い整数を返します。値が2つの整数のちょうど中間にある場合、既定の MidpointRounding の動作は偶数丸めです。つまり、隣り合う整数のうち偶数の方が結果になります。中間値を繰り返し丸めた際に上方向へ偏るのを避けられます。そのため、62.5 と 63.5 はそれぞれ異なる側の整数に丸められます。これは、0.5を常に上方向へ丸める方法とは異なります。
このセクションのコードと表示されるラベルや出力は英語のままです。
$firstTie = [Math]::Round(62.5)
$secondTie = [Math]::Round(63.5)
"$firstTie, $secondTie"
62, 64
小数点以下の桁数を指定して丸める
[Math]::Round(value, digits) を使うと、小数点以下の桁数を指定して丸められます。digits 引数は小数点以下の桁数を表します。0 は整数、1 は小数第1位、2 は小数第2位への丸めを指定します。結果は数値のままで、桁幅が固定された表示文字列ではないため、末尾のゼロが表示されないことがあります。価格など桁数を固定して扱う値は、表示時に別途書式設定し、計算には用途に合った数値型と丸め方を使います。
このセクションのコードと表示されるラベルや出力は英語のままです。
$value = 63.827439
$whole = [Math]::Round($value, 0)
$onePlace = [Math]::Round($value, 1)
$twoPlaces = [Math]::Round($value, 2)
"$whole; $onePlace; $twoPlaces"
64; 63.8; 63.83
中間値の丸め方を明示する
既定の偶数丸めが必要な方針と異なる場合は、MidpointRounding の値を [Math]::Round に渡します。MidpointRounding.AwayFromZero は、ちょうど中間の値をゼロから遠ざける方向へ丸めます。正の中間値は大きくなり、負の中間値は小さくなります。ゼロから遠ざける丸めが要件の場合は、このルールを明示して選びます。.NET にはほかの中間値ルールもあるため、「丸め」が常に一つの共通ルールを意味すると考えず、必要な方針を確認してください。
このセクションのコードと表示されるラベルや出力は英語のままです。
$positiveTie = [Math]::Round(2.5, [MidpointRounding]::AwayFromZero)
$negativeTie = [Math]::Round(-2.5, [MidpointRounding]::AwayFromZero)
"$positiveTie, $negativeTie"
3, -3