Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell浮点到字符串行为_Powershell_Floating Point_String Conversion - Fatal编程技术网

PowerShell浮点到字符串行为

PowerShell浮点到字符串行为,powershell,floating-point,string-conversion,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 这与二进制浮点数[float]和[double]在内存中的表示方式有关 为了表示在32位或64

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]是什么,这允许-实际上,在第一个示例中,在7位小数后,精度变得不稳定

[double]占用64位内存,因此称为double,因此具有更高的精度

在任何情况下,请使用[decimal]进行十进制运算,因为它总是使用10作为基数,而不是2,顾名思义,2是二进制浮点数的基数

[decimal]"4.2" + 3

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

执行算术运算时,PowerShell将浮点转换为双精度。 为显示设置浮点数格式时。 为了理解细节,我们首先观察到,当“4.2”正确地转换为IEEE-754基本二进制浮点,并将四舍五入转换为最近值时,浮点的结果正好是4.19999980926513671875,双精度的结果正好是4.20000000000000177635683940025046778106689453125

为了显示浮点结果,PowerShell实际上将其格式化为七位十进制数字,生成“4.200000”,然后抑制尾随零,生成“4.2”

PowerShell使用double而不是float进行算术运算。当您添加3时,结果是双精度,而不是浮点。结果值为7.19999980926513671875,由于这是双精度格式,PowerShell使用默认双精度格式对其进行格式化。在本例中,它将其格式化为15位,生成“7.19999980926514”

另一方面,对于[double]4.2+3,结果是7.200000000000000017763568394002504646778106689453125。将其格式化为15位时,结果为“7.200000000000000”。抑制尾随零将留下“7.2”


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

可能与字符串转换的注释重复是该问题的附带原因。对于数字文字,您将得到相同的结果,如果存在小数点或用科学记数法表示,则默认为[double];e、 例如,[浮动]4.2+3。您可以创建后缀为d的[decimal]文本;e、 例如,4.2d+3d。@PetSerAl:请不要随意地将浮点问题作为的副本关闭。此问题中的行为不仅仅是由浮点舍入引起的,而是由PowerShell在算术期间将float转换为double以及b PowerShell用于格式化浮点数字以供显示的默认规则引起的。