Powershell - 向下舍入到最接近的整数

时间:2011-05-03 00:06:31

标签: powershell

在Powershell中向下舍入到最接近的整数的最佳方法是什么?

我正在尝试[math] :: truncate,但它没有给我可预测的结果。

示例:

$bla = 17.2/0.1
[math]::truncate($bla) 

输出171而不是预期的172!

$bla = 172
[math]::truncate($bla) 

输出172

只需要一些有用的东西......并且必须始终向下舍入(即round($myNum + 0.5)由于面包师的舍入而无法正常工作,如果数字为0.5,则可能会四舍五入)

此致 泰德

4 个答案:

答案 0 :(得分:29)

啊,我明白了。看起来数据类型需要是十进制的:

[decimal] $de = 17.2/.1
[double] $db = 17.2/.1

[math]::floor($de)
172
[math]::floor($db)
171

http://msdn.microsoft.com/en-us/library/system.math.floor(v=vs.85).aspx

答案 1 :(得分:20)

Math :: Floor函数与[decimal]声明相结合可以为您提供所需的结果。

[Math]::Floor([decimal](17.27975/0.1))

return = 172

答案 2 :(得分:8)

您遇到原始17.2/0.1除法示例时遇到的问题是由于给定小数值的浮点表示不准确(如另一个答案中Joey's comment中所述)。您可以通过检查最终值的round-trip representation来在PowerShell中看到这一点:

PS> $bla = 17.2/0.1
PS> $bla.GetType().FullName
System.Double
PS> $bla.ToString()
172
PS> $bla.ToString('r')
171.99999999999997

解决此问题的一种简单方法是将结果声明为int,因为PowerShell会自动将结果舍入到最接近的整数值:

PS> [int]$bli = 17.2/0.1
PS> $bli.GetType().FullName
System.Int32
PS> $bli.ToString()
172

请注意,这使用MidpointRounding.ToEven的默认.NET方法(也称为银行家舍入)。在制表大量数值时,这具有很好的统计特性,但也可以更改为更简单的从零开始的方法:

function round( $value, [MidpointRounding]$mode = 'AwayFromZero' ) {
  [Math]::Round( $value, $mode )
}

PS> [int]3.5
4
PS> [int]4.5
4
PS> round 3.5
4
PS> round 4.5
5

另一种选择是对原始值使用更准确的表示,这将完全避免这个问题:

PS> $bld = [decimal]17.2/0.1
PS> $bld.GetType().FullName
System.Decimal
PS> $bld.ToString()
172

答案 3 :(得分:4)

[Math]::floor($x)是内置的方法。

请注意它与负数的表现方式。 [Math]::floor(5.5)会返回5,但[Math]::floor(-5.5)会返回-6

如果您需要函数返回最接近零的值,则需要:

If ($x -ge 0) {
    [Math]::Floor($x)
} Else {
    [Math]::Ceiling($x)
}