热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Powershell:将分数转换为整数-令人惊讶的舍入行为

如何解决《Powershell:将分数转换为整数-令人惊讶的舍入行为》经验,为你挑选了2个好方法。

关于带小数的整数,我有一个有趣的问题.

假设我执行以下操作:

[int] $a = 5/2
$a

我已经尝试了10次以确保,并且powershell总是返回 2

有没有办法强制Powershell在这种情况下向上或向下舍入,默认情况下它已设置为向下舍入?

我假设依赖于机器和Powershell环境,我可能在某些点得到3而在其他点得到2.



1> Vivek Kumar ..:
[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

您可以根据需要使用任一功能.


舍入2.5到2不是基础数学.发生这种情况是因为Powershells默认的MidpointRounding模式是ToEven,因此它会将.5数字舍入到最接近的偶数整数.要使用基础数学,您可以为AwayFromZero指定MidpointRounding模式.

2> mklement0..:

Vivek Kumar的回答很有帮助,但有一些令人困惑的方面.

通常,将分数转换为整数总是涉及一种舍入形式; 在转换隐式转换的上下文中,编程语言通常使用舍入到最接近整数的形式.特殊考虑适用于数字.5的模糊情况,其小数部分是精确的,存在多个策略 - 并且不同的编程语言采用不同的策略.

在构建PowerShell 的.NET Framework环境中,这些策略的总称中点舍入,下面使用的特定策略名称将中点(.5)称为简洁的一半(以下示例使用PowerShell语法,但适用于所有 .NET语言).

铸造[int] 总是采用到偶数舍入,其中具有的小数部分的数字.5被四舍五入到最接近的偶数整数(无论正或负):

[int] 2.5- > 2(!)情境下行,因为整数部分恰好是偶数和正数

[int] 3.5- > 4情景 -rounding

此舍入策略也适用于PowerShell有时执行的整数类型的隐式转换 - 请参阅上一节.

PowerShell的语法陷阱:铸造的优先级高于/,所以[int] 5/2不能按预期工作; 用[int] (5/2).

控制中点舍入行为,请使用.NET [Math]类的 Round()方法:

使用[int] [Math]::Round($number, [MidpointRounding]::AwayFromZero)得到外之零取整(有一小部分的数字.5四舍五入到其最接近的整数绝对越大).

[Math]::Round(2.5, [MidpointRounding]::AwayFromZero) - > 3

[Math]::Round(-2.5, [MidpointRounding]::AwayFromZero) - > -3

注意:[Math]方法(通常)返回a [double],因此您可能必须将结果转换为[int](或不同的整数类型)以获得真正的整数.

请注意,[Math]::Round()不仅提供整数舍入,还提供特定数量的小数位 ; 例如,
[Math]::Round(2.55, 1, [MidpointRounding]::AwayFromZero)收益率2.6.谢谢,Ansgar Wiechers.


其他形式的舍入:小数部分(除了0)的特定值无关的那些:

使用[Math]::Truncate($number)得到朝零取整(去除小数部分):

[Math]::Truncate(2.1)- > 2; 同上,用于2.52.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(!)


可选进一步阅读:

PowerShell执行使用此策略的隐式转换的示例:

1..(2.5)yield数组1, 2,因为范围运算符表达式的端点2.5被强制转换[int] 2,因此表达式实际上与1..2

由于PowerShell构建于.NET Framework之上,因此最终[Convert]::ToInt32()会调用它.

根据维基百科的说法,可能出人意料的半圆甚至策略背后的意图是"在对圆形数字求和时最小化预期误差" .

维基百科关于四舍五入的页面有一节关于编程语言的舍入函数.

与.NET相比,Javascript例如采用半向上舍入(Math.round(2.5)- > 3,Math.round(-2.5)- > -2) - 一种.NET甚至不提供的中点舍入模式.


推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Java数组的定义、初始化和多维数组的用法。通过动态初始化和静态初始化两种方式来初始化数组,并讨论了数组的内存分配和下标的特点。同时详细介绍了Java二维数组的概念和使用方法。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 随着我司的应用都开始容器化,相应的ETL流程也需要迁移到容器中。常规的SQL和shell脚本迁移之后执行基本没有问题,主要的问题在于数据接入使用kettle的场景下,kettle启 ... [详细]
author-avatar
李容怡姿齐芷全
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有