Powershell:将分数转换为整数 - 令人惊讶的舍入行为
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Powershell:将分数转换为整数 - 令人惊讶的舍入行为相关的知识,希望对你有一定的参考价值。
关于带小数的整数,我有一个有趣的问题。
假设我执行以下操作:
[int] $a = 5/2
$a
我已经尝试了10次以确定,并且powershell总是返回2
有没有办法强制Powershell在这种情况下向上或向下舍入,默认情况下它已设置为向下舍入?
我假设依赖于机器和Powershell环境,我可能会在某些点上获得3,在其他点上获得2。
[Math]::Floor($a) --> 2
[Math]::Ceiling($a)--> 3
[Math]::Round($a) --> 2
Floor
将给你前面的整数,Ceiling
将提供随后的整数。但是如果你想要使用Round
函数对其进行舍入,它将遵循中点舍入(中点舍入在历史上远离零),如下所示 -
[Math]::Round(2.50) --> 2
[Math]::Round(2.51) --> 3
[Math]::Round(2.49) --> 2
[math]::Round(2.50,[System.MidpointRounding]::AwayFromZero) --> 3
[math]::Round(2.49,[System.MidpointRounding]::AwayFromZero) --> 2
[math]::Round(2.51,[System.MidpointRounding]::AwayFromZero) --> 3
您可以根据需要使用任一功能。
Vivek Kumar's answer很有帮助,但有一些令人困惑的方面。
通常,将分数转换为整数总是涉及一种舍入形式;在转换和隐式转换的上下文中,编程语言通常使用rounding to the nearest integer的形式。特殊考虑适用于数字的模糊情况,其小数部分恰好是.5
,其中存在多个策略 - 并且不同的编程语言采用不同的策略。
在构建PowerShell的.NET Framework环境中,这些策略的总称是中点舍入,下面使用的特定策略名称将中点(.5
)称为简洁的一半(以下示例使用PowerShell语法) ,但适用于所有.NET语言)。
- 投射到
[int]
总是使用半到偶数舍入,其中.5
的小数部分的数字四舍五入到最接近的偶数整数(无论是正数还是负数):[int] 2.5
- >2
(!)情境下舍入,因为整数部分恰好是正的和正的[int] 3.5
- >4
情境上升 此舍入策略也适用于PowerShell有时执行的整数类型的隐式转换 - 请参阅上一节。 PowerShell语法陷阱:强制转换的优先级高于/
,因此[int] 5/2
不能按预期工作;使用[int] (5/2)
。 - 要控制中点舍入行为,请使用.NET
[Math]
class'Round()
方法: 使用[int] [Math]::Round($number, [MidpointRounding]::AwayFromZero)
得到半舍入的舍入(带有一小部分.5
的数字四舍五入到最接近的整数,其绝对值更大)。[Math]::Round(2.5, [MidpointRounding]::AwayFromZero)
- >3
[Math]::Round(-2.5, [MidpointRounding]::AwayFromZero)
- >-3
注意:[Math]
方法(通常)返回[double]
,因此您可能必须将结果转换为[int]
(或不同的整数类型)以获得真正的整数。
请注意,[Math]::Round()
不仅提供整数舍入,还提供特定数量的小数位;例如。,
[Math]::Round(2.55, 1, [MidpointRounding]::AwayFromZero)
收益2.6
.Thanks,Ansgar Wiechers。
其他形式的舍入:小数部分(0
除外)的特定值无关的那些:
- 使用
[Math]::Truncate($number)
进行零舍入(去除小数部分):[Math]::Truncate(2.1)
- >2
;例如,2.5
和2.9
同样如此[Math]::Truncate(-2.1)
- >-2
- 使用
[Math]::Ceiling($number)
进行正向无穷舍入(舍入到最接近的大小或等于整数):[Math]::Ceiling(2.1)
- >3
[Math]::Ceiling(-2.1)
- >-2
(!) - 使用
[int] [Math]::Floor($number)
进行负向无穷圆舍入(向下舍入到最接近的小或等于整数):[Math]::Floor(2.1)
- >2
[Math]::Floor(-2.1)
- >-3
(!)
Optional further reading:
PowerShell执行使用此策略的隐式转换的示例:
1..(2.5)
产生数组1, 2
,因为范围运算符表达式的终点2.5
被强制转换为[int]
2
,因此表达式与1..2
实际上相同
由于PowerShell构建于.NET Framework之上,因此最终调用的是[Convert]::ToInt32()
。
according to Wikipedia表示,可能令人惊讶的圆形半到均匀策略背后的意图是“在对圆形数字进行求和时最小化预期误差”。
维基百科关于四舍五入的页面有关于rounding functions across programming languages的部分。
与.NET相比,例如,javascript采用半向上舍入(Math.round(2.5)
- > 3
,Math.round(-2.5)
- > -2
) - 一种.NET甚至不提供的中点舍入模式。
以上是关于Powershell:将分数转换为整数 - 令人惊讶的舍入行为的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 405. 数字转换为十六进制数(补码的问题) / 166. 分数到小数(模拟长除法) / 482. 密钥格式化