Implementacja sufitu jest następująca:
function Get-Ceiling($x) { [int]$ceil = [int]$x if($ceil -ne $x) { $diff = $ceil - $x if($diff -ge 0) { return $ceil }else{ return $ceil+1 } } return $ceil }A podłogi jest taka:
function Get-Floor($x) { [int]$floor = [int]$x if($floor -ne $x) { $diff = $floor - $x if($diff -ge 0) { return $floor-1 }else{ return $floor } } return $floor }Implementacja algorytmu podłogi i i sufitu jest zupełnie inna niż dla c podobnych języków programowania (C,C++,java, c#) jak i dla VB
Postanowiłem zaimplementować inne funkcje, za pomocą już zdefiniowanych funkcji:
function Get-Sign([int]$x) { if($x -gt 0) { return 1 } elseif($x -lt 0) { return -1 } return $x } function Get-Abs([decimal]$x) { return $x * (Get-Sign($x)) } function Get-Round($x) { if([int]$x -ge 0) { return Get-Floor($x + 0.5D) # D for Decimal } return Get-Ceiling($x - 0.5D) } function Get-Sawtooth($x) { return $x - (Get-Floor($x)) }Funkcja Sawtooth zwraca ułamek ( może powinna się nazywać funkcją zębatej piły)
function Get-Truncate($x) { return (Get-Sign($x)) * (Get-Floor(Get-Abs($x))) }Dla funkcji Get-Truncate złe będzie zwracana liczba jeżeli funkcja zwracająca sygnału będzie bez nawiasów:
Get-Sign($x) * (Get-Floor(Get-Abs($x)))
Dodatkowo mamy implementację tych części funkcji dla licz używanych jako wartość pieniądza (z dokładności liczby do 2 miejsc po przecinku):
function Get-RoundMoney($x) { return (Get-Round($x*100))/100 } function Get-SawtoothMoney($x) { return [decimal]($x*100) - (Get-Floor($x*100)) } function Get-TruncateMoney($x) { return (Get-Sign($x)) * ((Get-Floor(Get-Abs([decimal]$x*100)))/100) }
Dla funkcji Get-TruncateMoney też będziemy mieli problem z ze zmienną $x.
Bez [decimal] nie zadziała Get-TruncateMoney.
Przy wywołaniu Get-TruncateMoney -19.0190 uzyskamy błąd z tekstem:-19.0190-19.0190-19.0190-19.0190-19.0190-19.0190... itd.
Tak się zastanawiam czy nie lepiej było by zaimplementować te funkcje w .NET i skorzystać z wygenerowanej biblioteki.
Brak komentarzy:
Prześlij komentarz