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 行为引起的:

为了理解细节,我们首先观察,当“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 时不会以尾随零结尾位数。)