代码之家  ›  专栏  ›  技术社区  ›  Jack

PowerShell浮点到字符串行为

  •  0
  • Jack  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  6
  •   mklement0    7 年前

    这与二进制浮点数的方式有关( [float] [double] ),在内存中表示。

    为了表示在范围上变化的数值,这些数值超出了可以一致地存储在32位或64位内存中的范围,浮点数以以下形式存储为计算:

    coefficient*base^exponent
    

    对于32位二进制浮点数 [浮动] 是),这允许 a precision of roughly 7.2 decimal points -事实上,在你的第一个例子中,精度在7个小数之后变得不稳定。

    这个 [双] 占用64位内存(因此得名 双重的 )因此具有更高的精度。

    无论如何,请使用 [decimal] 对于十进制算法,因为它总是使用10作为基数,而不是2(顾名思义,这就是 二元的 浮点数用作基数)。

    [decimal]"4.2" + 3
    
        2
  •  2
  •   Eric Postpischil    7 年前

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

    为了理解这些细节,我们首先观察到,当4.2正确地转换为IEEE-754基本二进制浮点并舍入到最接近的值时,结果正好是4.19999980926513671875 浮动 和4.20000000000000017763568394002504646778106689453125 双重的 .

    显示 浮动 结果,PowerShell(实际上)将其格式化为七个十进制数字,生成“4.200000”,然后抑制尾随的零,生成“4.2”。

    PowerShell使用 双重的 ,不是 浮动 . 当你加上3,结果是 双重的 ,不是 浮动 . 结果值为7.1999980926513671875,并且,因为这是 双重的 ,PowerShell将其格式化为默认值 双重的 格式。在本例中,它用15位数字格式化,生成7.19999090926514。

    为了 [double]"4.2" + 3 另一方面,结果是7.20000000001077635683940025046778106689453125。当它被格式化为15位时,结果是“7.2000000000”。抑制尾随的零会留下“7.2”。

    (请注意,这种简单的结果并不总是算术之后的情况。)。在某些情况下,加法会导致低位的某些舍入,结果是,当格式化为15位时,计算结果不会以尾随零结束。)

    推荐文章