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 VBPostanowił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