2つの丸められた値の減算が私に非丸められた値を与える理由を理解しようと苦労しています。 2.2 - 1.1 = 1.10000001の場合と似ています。PowerShell [数学] ::ラウンドは丸められないことがありますか?
私はPowerShellでスクリプトのこのブロックを持っている:、
$usedSpaceGB = $sizeGB - $freeSpaceGB
[数学] ::ラウンド()メソッドが意図したとおりに動作しているようですので:厄介な部分がある
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"
}
$ sizeGBと$ freeSpaceGB変数に丸められた値が格納されているのがわかります。ここではいくつかのデバッグ出力例は以下のとおりです。
- あなたは例の画像で見ることができるようにいくつかのケースでは2の減算は、以前に非丸めた値の値の結果を丸め、なぜ私は理解していません。
- この現象は、ループの同じ正確な位置で発生し、7,10、および18回の繰り返しで発生します。
の表は、この値は丸められていないと奇妙に見えるので、私は、HTMLファイルにこのデータをエクスポート:
を今、私は「固定」も減算結果、この丸めではなく、私は」なぜこれが起こっているのだろうかと疑問に思います。誰かが私に何が起こっているのか理解するのを助けてくれることを願っています
よし
私は '$ disks'が[' Win32_LogicalDisk'](https://msdn.microsoft.com/library/aa394173.aspx)のインスタンスだとしますか?もしそうなら、 'FreeSpace'と' Size'は整数型(両方とも 'UInt64')ですが、[Math.Round']に渡します(https://msdn.microsoft.com/library/system.math.round .aspx)あなたは 'Double'バックを取得しています。これは[浮動小数点数がいくつかの数字を正確に表すことができない]という通常の問題の影響を受けます(https://stackoverflow.com/questions/1089018/why- cant-decimal-numbers-be-exactly-in-binary)を使用します。私は中間の値ではなく最終的な出力のみを丸めます。 – BACON