PowerShell 浮动到字符串行为
PowerShell float to string behaviour
PowerShell 处理以下命令并产生有趣的结果。希望有高人能解释一下原因。
这里没有问题:
PS C:\> [float]"4.2"
4.2
PS C:\> [double]"4.2"
4.2
但是当你做一些算术运算时,事情就会变得有趣:
PS C:\> [float]"4.2" + 3
7.19999980926514
PS C:\> [double]"4.2" + 3
7.2
这与二进制浮点数([float]
和 [double]
)在内存中的表示方式有关。
为了表示变化范围超出 32 位或 64 位内存可一致存储范围的数值,浮点数以以下形式存储为计算:
coefficient*base^exponent
对于 32 位二进制浮点数([float]
是什么),这允许 a precision of roughly 7.2 decimal points - 实际上你会看到精度在 7 位小数后变得不稳定第一个例子。
[double]
占用64位内存(因此得名double),精度更高
在任何情况下,请使用 [decimal]
进行十进制运算,因为它总是以 10 作为基数,而不是 2(顾名思义,就是 binary 浮点数用作基数)。
[decimal]"4.2" + 3
这是由两个 PowerShell 行为引起的:
- 执行算术运算时,PowerShell 将
float
转换为 double
。
- 格式化浮点数显示时,PowerShell’s default is to use its General format and default precisions that depend on the type (seven digits for
float
, 15 for double
) but suppresses trailing zeros。
为了理解细节,我们首先观察,当“4.2”被正确地转换为 IEEE-754 基本二进制浮点数时,结果恰好是 4.19999980926513671875 float
和 4.20000000000000017763568394002504646778106689453125 double
.
为了显示 float
结果,PowerShell(实际上)将其格式化为七位十进制数字,生成“4.200000”,然后去除尾随零,生成“4.2”。
PowerShell 使用 double
而不是 float
进行算术运算。当您添加 3 时,结果是 double
,而不是 float
。结果值为 7.19999980926513671875,并且由于这是一个 double
,PowerShell 将其格式化为默认的 double
格式。在这种情况下,它将其格式化为 15 位数字,生成“7.19999980926514”。
另一方面,对于[double]"4.2" + 3
,结果是7.20000000000000017763568394002504646778106689453125。将其格式化为 15 位数字时,结果为“7.20000000000000”。抑制尾随零留下“7.2”。
(请注意,这样简单的结果在算术运算后并不总是如此。在某些情况下,加法会导致低位舍入,结果计算结果在格式化为 15 时不会以尾随零结尾位数。)
PowerShell 处理以下命令并产生有趣的结果。希望有高人能解释一下原因。
这里没有问题:
PS C:\> [float]"4.2"
4.2
PS C:\> [double]"4.2"
4.2
但是当你做一些算术运算时,事情就会变得有趣:
PS C:\> [float]"4.2" + 3
7.19999980926514
PS C:\> [double]"4.2" + 3
7.2
这与二进制浮点数([float]
和 [double]
)在内存中的表示方式有关。
为了表示变化范围超出 32 位或 64 位内存可一致存储范围的数值,浮点数以以下形式存储为计算:
coefficient*base^exponent
对于 32 位二进制浮点数([float]
是什么),这允许 a precision of roughly 7.2 decimal points - 实际上你会看到精度在 7 位小数后变得不稳定第一个例子。
[double]
占用64位内存(因此得名double),精度更高
在任何情况下,请使用 [decimal]
进行十进制运算,因为它总是以 10 作为基数,而不是 2(顾名思义,就是 binary 浮点数用作基数)。
[decimal]"4.2" + 3
这是由两个 PowerShell 行为引起的:
- 执行算术运算时,PowerShell 将
float
转换为double
。 - 格式化浮点数显示时,PowerShell’s default is to use its General format and default precisions that depend on the type (seven digits for
float
, 15 fordouble
) but suppresses trailing zeros。
为了理解细节,我们首先观察,当“4.2”被正确地转换为 IEEE-754 基本二进制浮点数时,结果恰好是 4.19999980926513671875 float
和 4.20000000000000017763568394002504646778106689453125 double
.
为了显示 float
结果,PowerShell(实际上)将其格式化为七位十进制数字,生成“4.200000”,然后去除尾随零,生成“4.2”。
PowerShell 使用 double
而不是 float
进行算术运算。当您添加 3 时,结果是 double
,而不是 float
。结果值为 7.19999980926513671875,并且由于这是一个 double
,PowerShell 将其格式化为默认的 double
格式。在这种情况下,它将其格式化为 15 位数字,生成“7.19999980926514”。
另一方面,对于[double]"4.2" + 3
,结果是7.20000000000000017763568394002504646778106689453125。将其格式化为 15 位数字时,结果为“7.20000000000000”。抑制尾随零留下“7.2”。
(请注意,这样简单的结果在算术运算后并不总是如此。在某些情况下,加法会导致低位舍入,结果计算结果在格式化为 15 时不会以尾随零结尾位数。)