Ich habe Kampf versuchen, herauszufinden, warum einige Male die Subtraktion von zwei gerundeten Werten gibt mir einen nicht gerundeten Wert. Ist wie wenn 2.2 - 1.1 = 1.10000001.Powershell [Math] :: Round Runden manchmal nicht?
ich diesen Block von einem Skript in Powershell haben:
foreach($disk in $disks)
{
$size = $disk.Size
$freespace = $disk.FreeSpace
$percentFree = [Math]::Round(($freespace/$size) * 100)
$sizeGB = [Math]::Round($size/1073741824, 2)
$freeSpaceGB = [Math]::Round($freespace/1073741824, 2)
$usedSpaceGB = $sizeGB - $freeSpaceGB
#view the variable values in every iteration
Write-Debug "`$size = $size"
Write-Debug "`$freespace = $freespace"
Write-Debug "`$percentFree = $percentFree%"
Write-Debug "`$sizeGB = $sizeGB"
Write-Debug "`$freeSpaceGB = $freeSpaceGB"
Write-Debug "`$usedSpaceGB = $usedSpaceGB"
}
Der beunruhigende Teil ist:
$usedSpaceGB = $sizeGB - $freeSpaceGB
Die [Math] :: Round() Methode scheint wie beabsichtigt zu arbeiten, denn Ich kann die gerundeten Werte in den Variablen $ sizeGB und $ freeSpaceGB sehen. Hier sind einige Debug-Ausgabe Beispiele:
- Ich verstehe nicht, warum in einigen Fällen die Subtraktion zweier zuvor gerundete Werte ergibt sich ein nicht gerundeter Wert, wie Sie in Beispiel Bilder sehen .
- dieses Verhalten in der gleichen genauen Positionen der Schleife der Fall ist, können sagen, in der 7, 10 und 18 Iteration.
ich diese Daten in eine HTML-Datei exportieren, um die Tabelle mit dieser Werte nicht gerundet ungerade aussieht:
ich auch das Subtraktionsergebnis dies durch Abrunden „fixiert“ Gerade jetzt, aber ich Ich frage mich, warum das passiert. Ich hoffe, dass mir jemand helfen kann zu verstehen, was vor sich geht.
I '$ disks' nehmen ist eine Sammlung von [' Win32_LogicalDisk'] (https://msdn.microsoft.com/library/aa394173.aspx) Instanzen? Wenn das so ist, sind "FreeSpace" und "Size" Integer-Typen (beide "UInt64"), aber indem sie an [Math.Round] übergeben werden (https://msdn.microsoft.com/library/system.math.round .aspx) erhalten Sie eine 'Double' zurück, die dann dem üblichen Problem von [Fließkommazahlen, die einige Zahlen nicht genau darstellen können] unterliegt (https://stackoverflow.com/questions/1089018/why- cant-decimal-numbers-wird-genau-in-binary dargestellt. Ich würde nur die Endausgabe runden, keine Zwischenwerte. – BACON