Esto no parece una pregunta de Inno Setup, pero en realidad está relacionada con su útil Pascal Script.

Escribí un código para hacer un cálculo de punto flotante.

Height, DivisionOfHeightWidth, Width: Integer;

Height := 1080;
Width := 1920;

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

El registro del compilador da la salida:

The Division Of Height and Width: 1

Quiero que esta salida del compilador devuelva esto en su lugar:

The Division Of Height and Width: 1.77

No puedo declarar Height y Width como Extended , Single o Double ya que regresan como Integer en la mayoría de las situaciones, así que necesito convertir esos dos enteros a dos individuales.

Después de hacerlo:

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));

El registro del compilador ahora da la salida:

The Division Of Height and Width: 1.777777791023

Pero, ¿cómo puedo obtener este resultado como 1.77? (No 1.78 por redondeo) Quiero decir, ¿cómo puedo redondear este 1.777777791023 a dos lugares decimales como 1.77?

Si es imposible redondearlo como 1.77, ¿cómo puedo redondearlo como 1.78?

Gracias de antemano.

8
GTAVLover 16 ago. 2016 a las 07:25

2 respuestas

La mejor respuesta

Si el redondeo es aceptable, una solución sencilla es utilizar la función Format :

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

Para obtener detalles sobre la cadena de formato, consulte la documentación de Delphi para la función Format.

Tenga en cuenta que Format usa un formato de número específico de la configuración regional (separador decimal en particular).


Si realmente necesita truncar, debe implementarlo usted mismo como:

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;

Lo anterior funciona en Unicode Inno Setup solo ya que en la versión Ansi el FloatToStr usa un separador decimal específico de la localidad, es decir, no siempre el .. En Inno Setup 6 actual, la versión Unicode es la única versión.

6
Martin Prikryl 18 mar. 2020 a las 14:47

th norte norte

DivisionOfHeightWidthF := WidthF / HeightF;
DivisionOfHeightWidthF := Trunc(DivisionOfHeightWidthF*100.0)/100.0;

Sin embargo, un problema es que en el paso de truncado, los valores que son ligeramente más bajos que el valor entero se truncarán más abajo, por lo que debe obtener el número entero correcto con round() antes de dividir

DivisionOfHeightWidthF := round(int(DivisionOfHeightWidthF*100.0)))/100.0;

Relacionado: ¿Cómo puedo redondear un número entero al 1000 más cercano en Pascal?

1
phuclv 21 feb. 2019 a las 14:55