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,而向下取整会得到 -5。如果你需要去掉小数位,但不希望结果总是朝负无穷方向移动,就应使用截断。
本节中的代码以及显示的标签或输出仍为英文。
$positive = [Math]::Truncate(4.8)
$negative = [Math]::Truncate(-4.8)
"$positive, $negative"
4, -4
使用 [Math]::Floor 向下取整,并使用 [Math]::Ceiling 向上取整
[Math]::Floor 返回小于或等于输入值的最大整数,因此结果朝负无穷方向移动。[Math]::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 会舍入到不同的相邻整数。这与始终将半数向上舍入并不相同。
本节中的代码以及显示的标签或输出仍为英文。
$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
显式选择中点值的处理方式
如果默认的舍入到偶数规则不符合你的策略要求,可以向 [Math]::Round 传入一个 MidpointRounding 值。MidpointRounding.AwayFromZero 会将恰好位于中点的值舍入到远离零的方向:正数中点会变大,负数中点会变小。如果需求规定了半数远离零的处理方式,请明确选择此规则。.NET 还提供其他中点规则,因此应核对所需策略,不要默认认为“舍入”总是指同一种中点处理规则。
本节中的代码以及显示的标签或输出仍为英文。
$positiveTie = [Math]::Round(2.5, [MidpointRounding]::AwayFromZero)
$negativeTie = [Math]::Round(-2.5, [MidpointRounding]::AwayFromZero)
"$positiveTie, $negativeTie"
3, -3