PowerShell浮动到字符串行为

时间:2018-08-04 23:57:44

标签: powershell floating-point string-conversion

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

2 个答案:

答案 0 :(得分:6)

这与在内存中表示二进制浮点数([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

答案 1 :(得分:2)

这是由两种PowerShell行为引起的:

要了解详细信息,我们首先观察到,当将“ 4.2”正确地转换为具有舍入到最近的IEEE-754基本二进制浮点数时,对于float和4.20000000000000017763568394002504646778106689453125,结果恰好是4.19999980926513671875为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位数字进行格式化时,计算结果将不会以尾随零结束。 )