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
答案 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行为引起的:
float
转换为double
。float
, 15 for double
) but suppresses trailing zeros。要了解详细信息,我们首先观察到,当将“ 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位数字进行格式化时,计算结果将不会以尾随零结束。 )