IRF - HF1 - Tizedestört formázás és komparálás anomália

0 votes
asked Mar 26, 2015 in IRF tantárgy by Sanny (53 points)  
edited Mar 26, 2015 by micskeiz

Sziasztok!

Az alábbi számomra furcsasággal találkoztam, teljesen leegyszerűsítve:

$a = 99.001
$a = "{0:0.##}" -f $a
write-output ($a -ge 90)

Mentés és futtatás után, ez a kódrészlet vígan kiírja amit várok tőle (True).
Azonban ha $a értékét 100.001-re állítom be tehát így:

$a = 100.001
$a = "{0:0.##}" -f $a
write-output ($a -ge 90)

akkor False-t ír ki.

A

 "{0:0.##}"

formázás én úgy tudom, hogy levágná a tizedestört mögötti helyiértékek végét, hogy 2 maradjon. Valóban ezt teszi egyébként a kiíratások alapján, de közben valahogy nagyon fura.
Ha az utóbbi esetben kiíratom $a-t, akkor teljes természetességgel kiírja hogy $a az bizony 100, de mégsem működik a logikai összehasonlítás.

Valaki tud erre magyarázatot?

(U.i.: több formázással is próbálkoztam, ugyanez volt a tünet)

1 Answer

+1 vote
answered Mar 26, 2015 by hajdua (688 points)  
edited Mar 28, 2015 by hajdua
 
Best answer

Szia!

Az általad írt alábbi kódrészlet helyesen működik, szerintem az utolsó sorban konstanst elfelejtetted átírni 90-ről 100-ra és ezért lesz nyilvánvalóan False.

$a = 100.001
$a = "{0:0.##}" -f $a
write-output ($a -ge 90)

Ha átírom az utolsó sort 90-ről 100-ra, akkor nálam True-t ír ki.

Szerk.: a fentiek így nem igazak, helyes válasz a kommentekben.

Egyébként ha ez a kérdés az 1E házival kapcsolatban vetődött fel, akkor azt javasolnám, hogy belül a számolásoknál ne kerekíts, csak a legvégén a kiírás formátuma legyen 2 tizedesjegyre kerekített.

Így nyilván előfordulhat olyan, hogy pl. a 20% alatti értékeket kell kiírni úgy, hogy a 20% már nem számít bele és van egy 19,999%-os csoport, akkor ez a kiírásnál nyilván 20.00%-ként fog megjelenni, de ez nem gond, mert a mögöttes számítás jó.

commented Mar 26, 2015 by Sanny (53 points)  
Ha átírom 100-ra valóban igazat adna vissza, de -ge logikai operátort használok, mely mindkét esetben igaz értéket kellene visszaadjon szerintem.
Köszönöm a tanácsot, viszont ezt igazából általánosságban kérdeztem, mivel baromira nem tudtam magam megmagyarázni, és más fórumokon sem találtam erről információt.
commented Mar 27, 2015 by hajdua (688 points)  
Igazad van, a -ge operátort én véletlenül fordítva néztem. Akkor viszont a magyarázat szerintem az, hogy a
    $a = "{0:0.##}" -f $a
utasítás hatására az $a változó String típusú lesz. Ezt ha a 90-nel mint egész számmal hasonlítod össze, akkor a 90-et is String-ként értelmezi és elkezdi karakterenként hasonlítani és az '1'-nél a '9' nagyobb.

Ha úgy szeretnél kerekíteni, hogy szám maradjon, akkor a [math]::round(mit, hány jegyre) parancsot használd.
commented Mar 28, 2015 by Sanny (53 points)  
Hm köszönöm,  ez valóban lehetségesnek hangzik!
...