2016-08-16 16 views
5

To nie wygląda jak pytanie Inno Setup, ale jest faktycznie związane z jego użytecznym skryptem Pascal.Zaokrąglanie/Obcinanie liczb zmiennoprzecinkowych do N miejsc po przecinku w konfiguracji Inno Pascal Script

Napisałem kod do obliczeń zmiennoprzecinkowych.

Height, DivisionOfHeightWidth, Width: Integer; 

Height := 1080; 
Width := 1920; 

DivisionOfHeightWidth := Width/Height; 
Log('The Division Of Height and Width: ' + IntToStr(DivisionOfHeightWidth)); 

Compiler dziennika daje wyjście:

The Division Of Height and Width: 1 

Chcę wyjście kompilatora, aby powrócić to zamiast:

The Division Of Height and Width: 1.77 

Nie mogę zadeklarować Height i Width jak Extended , Single lub Double ponieważ w większości przypadków wracają jako Integer, więc muszę przekonwertować te dwa Liczby całkowite do dwóch Singli.

Po zrobieniu go:

Height, Width: Integer; 
HeightF, WidthF, DivisionOfHeightWidthF: Single; 

Height := 1080; 
Width := 1920; 

HeightF := Height; 
WidthF := Width; 
DivisionOfHeightWidthF := WidthF/HeightF; 
Log('The Division Of Height and Width: ' + FloatToStr(DivisionOfHeightWidthF)); 

Compiler dziennika teraz daje wyjście:

The Division Of Height and Width: 1.777777791023 

Ale jak mogę to wyjście jako 1.77? (Nie 1.78 przez zaokrąglenia) Mam na myśli, jak mogę zaokrąglić to 1.777777791023 z dwoma miejscami po przecinku, jak 1.77?

Jeśli zaokrąglanie go tak, jak 1.77 jest niemożliwe, jak mogę to zaokrąglić, tak jak 1.78?

Z góry dziękuję.

Odpowiedz

3

przypadku zaokrąglenia jest dopuszczalne, łatwo roztwór pomocą Format function:

var 
    Height, Width: Integer; 
    DivisionOfHeightWidthF: Single; 
begin 
    ... 
    DivisionOfHeightWidthF := Single(Width)/Height; 
    Log(Format('The Division Of Height and Width: %.2f', [DivisionOfHeightWidthF])); 
end; 

szczegółowe informacje dotyczące łańcucha formatu, patrz dokumentacja Delphi dla Format function.

Należy pamiętać, że Format używa formatu numeru specyficznego locale (w szczególności separator dziesiętny).


Jeśli naprawdę potrzebujesz obcinania, trzeba go wdrożyć bardziej podoba:

var 
    Height, Width: Integer; 
    DivisionOfHeightWidthF: Single; 
    S: string; 
    P: Integer; 
begin 
    ... 
    DivisionOfHeightWidthF := Single(Width)/Height; 
    S := FloatToStr(DivisionOfHeightWidthF); 
    P := Pos('.', S); 
    if P < Length(S) - 2 then 
    begin 
    SetLength(S, P + 2); 
    end; 
    Log(S); 
end; 

Powyższe prace w Inno Setup Unicode tylko w wersji Ansi FloatToStr używa lokalizacji specyficznych separator dziesiętny, tj nie zawsze jest to ..

+0

Użyłem twojej implementacji zamiast formatowania String. Działało bardzo dobrze! Dziękujemy! ........ Mam szczęście, ponieważ zawsze używam wersji Inno Setup Unicode .....;) – GTAVLover

1

Aby skrócić do cyfry n-tego wystarczy pomnożyć przez 10^n trucate część ułamkowa podzielić przez 10^n ponownie

DivisionOfHeightWidthF := WidthF/HeightF; 
DivisionOfHeightWidthF := Trunc(DivisionOfHeightWidthF*100)/100.0; 
Log('The Division Of Height and Width: ' + FloatToStr(DivisionOfHeightWidthF)); 
+0

To nie zadziała, jeśli wartość '1.77' nie jest reprezentatywna dla danej precyzji zmiennoprzecinkowej. W szczególności nie będzie działać z 'Single'. Otrzymasz '1.769999980927'. Będzie działać z 'Double'.Ale nawet z 'Double', możesz trafić ten sam problem z różnymi liczbami. –

Powiązane problemy