HOWTO · PowerShell
如何在 PowerShell 中四捨五入數字
本文將討論如何使用 .NET 框架數學類的多個函數在 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,但向下取整會得到 -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) 會傳回最接近的整數。當數值恰好位於兩個整數的中間時,預設的 MidpointRounding 行為是取偶數:結果會是相鄰的偶數整數。這可避免反覆處理中點時,結果系統性地偏向較大的數。62.5 和 63.5 這兩個中點因此會取到不同的相鄰整數。這並不等同於一律將 .5 往上取整。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
$firstTie = [Math]::Round(62.5)
$secondTie = [Math]::Round(63.5)
"$firstTie, $secondTie"
62, 64
取到指定的小數位數
使用 [Math]::Round(value, digits) 可將數值取整到指定的小數位數。digits 引數代表小數位數:0 表示取到整數,1 表示取到小數點後一位,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