about_Numeric_Literals

简短说明

本文介绍 PowerShell 中数值的语法和用法。

详细说明

有两种类型的数字文本:整数和实数。 两者都可以具有乘数后缀。

整数文本

整数文本可以采用十进制或十六进制表示法编写。 十六进制文本的前缀为 0x,以将它们与十进制数区分开来。

整数文本可以具有类型后缀和乘数后缀。

后缀 含义
l 长数据类型
kb kibibyte (10241) 乘数
mb mebibyte (10242) 乘数
gb 吉吉比特 (10243) 乘数
tb teribyte (10244) 乘数
pb petibyte (10245) 乘数

整数文本的类型取决于其值、类型后缀和数字乘数后缀。

对于没有类型后缀的整数文本:

  • 如果值可以通过 [int] 类型表示,则这就是其类型。
  • 否则,如果值可以通过 [long] 类型表示,则这就是其类型。
  • 否则,如果值可以通过 [decimal] 类型表示,则这就是其类型。
  • 否则,它由 [double] 类型表示。

对于有类型后缀的整数文本:

  • 如果类型后缀为 u,并且值可以由类型 [int] 表示,则其类型为 [int]
  • 如果类型后缀为 u,并且值可以由类型 [long] 表示,则其类型为 [long]
  • 如果其值可以通过指定的类型表示,则这就是其类型。
  • 否则,该文本格式不正确。

实际文本

实际文本只能用十进制表示法编写。 此表示法可以包括小数点后面的小数值和使用指数部分的科学表示法。

指数部分包括一个“e”,后跟一个可选符号 (+/-) 和一个表示指数的数字。 例如,文本值 1e2 等于数值 100。

实数文本可以具有类型后缀和乘数后缀。

后缀 含义
d decimal 数据类型
kb kibibyte (10241) 乘数
mb mebibyte (10242) 乘数
gb 吉吉比特 (10243) 乘数
tb teribyte (10244) 乘数
pb petibyte (10245) 乘数

有两种类型的实数文本:double 和 decimal。 这些都是通过是否存在 decimal-type 后缀来分别指明。 PowerShell 不支持 [float] 值的文字表示形式。 双精度实数文本的类型为 [double]。 十进制实数文本的类型为 [decimal]。 十进制实数文本的小数部分中的尾随零很重要。

如果 [double] 实数文本中 exponent-part 的位数少于支持的最小值,则 [double] 实数文本的值为 0。 如果 [decimal] 实数文本中 exponent-part 的位数少于支持的最小值,则该实数的格式错误。 如果 [double][decimal] 实数文本中 exponent-part 的位数多于支持的最大值,则该文本的格式错误。

注意

该语法允许双实数文本具有 long-type 后缀。 PowerShell 将此案例视为一个整数文本,其值由 [long] 类型表示。 保留此功能是为了向后兼容早期版本的 PowerShell。 但是,不建议程序员使用这种形式的整数文本,因为它们很容易掩盖文本的实际值。 例如,1.2L 具有值 1,1.2345e1L 具有值 12,1.2345e-5L 具有值 0,这些都不明显。

数字乘数

为方便起见,整数和实数文本可以包含一个数字乘数,表示一组常用的 2 的幂中的一个。 数字乘数可以用大写或小写字母的任意组合形式编写。

乘数后缀可与 uull 类型后缀结合使用。

乘数示例

PS> 1kb
1024

PS> 1.30Dmb
1363148.80

PS> 0x10Gb
17179869184

PS> 1.4e23tb
1.5393162788864E+35

PS> 0x12Lpb
20266198323167232

数值类型加速器

PowerShell 支持以下类型加速器:

加速器 注意 说明
[byte] 字节(无符号)
[sbyte] 字节(有符号)
[int16] 16 位整数
[uint16] 16 位整数(无符号)
[int32] 32位整数
[int] [int32] 的别名 32位整数
[uint32] 32 位整数(无符号)
[int64] 64 位整数
[long] [int64] 的别名 64 位整数
[uint64] 64 位整数(无符号)
[bigint] 请参阅 BigInteger 结构
[single] 单精度浮点
[float] [single] 的别名 单精度浮点
[double] 双精度浮点
[decimal] 128 位浮点

使用其他数值类型

若要处理任何其他数值类型,必须使用类型加速器,这并非没有一些问题。 例如,在强制转换为任何其他类型之前,始终将高整数值分析为双精度值。

PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904

该值首先分析为双精度值,在更高的范围内失去精度。 若要避免此问题,请以字符串的形式输入值,然后将其转换:

PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111

例子

下表包含几个数值文字示例,并列出了其类型和值:

数字 类型
100 Int32 100
100D 小数 100
100l Int64 100
1e2 双精度 100
1.e2 双精度 100
0x1e2 Int32 482
0x1e2L Int64 482
0x1e2D Int32 7725
482D 小数 482
482gb Int64 517543559168
0x1e2lgb Int64 517543559168

数字类型转换

当字符串转换为数字时,支持其他十六进制格式指示器。 这些附加格式不能识别为文本。

[int] '0xF' -eq 0xF
[int] '&hF' -eq 0xF
[int] '#F' -eq 0xF

类似于数字文本的命令

任何看起来像数字文本的命令都必须使用调用运算符(&)执行,否则它将解释为一些关联的类型。

访问数字对象的属性和方法

若要访问数字文本的成员,在某些情况下需要将文本括在括号中。

  • 文本没有小数点
  • 文本在小数点之后没有任何数字
  • 文本没有后缀

例如,下面的示例失败:

PS> 2.GetType().Name
At line:1 char:11
+ 2.GetType().Name
+           ~
An expression was expected after '('.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression

以下示例起作用:

PS> 2L.GetType().Name
Int64
PS> 1.234.GetType().Name
Double
PS> (2).GetType().Name
Int32

前两个示例无需将文字值括在括号中,因为 PowerShell 分析程序可以确定数字文本结束和 GetType 方法开始的位置。