在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,则可能会四舍五入)
此致 泰德
答案 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)
}