2016-08-16 105 views
5

这看起来不像Inno Setup问题,但实际上与其有用的Pascal脚本有关。在Inno Setup Pascal脚本中将浮点数舍去到N个小数位

我写了一个代码来做浮点计算。

Height, DivisionOfHeightWidth, Width: Integer; 

Height := 1080; 
Width := 1920; 

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

编译器日志给出了输出:

The Division Of Height and Width: 1 

我想这个编译器的输出,而不是返回此:

The Division Of Height and Width: 1.77 

我不能宣布HeightWidthExtended , SingleDouble因为他们在大多数情况下返回Integer,所以我需要转换这两个整数到两个单打。

做后:

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

编译器日志现在给人的输出:

The Division Of Height and Width: 1.777777791023 

但我怎么能得到这个输出1.77(不是1.78通过舍入) 我的意思是我怎么能把这个1.777777791023舍入到小数点后两位,如1.77

如果四舍五入就像1.77是不可能做到的,我怎么能像1.78那样围绕它?

在此先感谢。

回答

3

如果舍入是可接受的,一个简单的解决方案是使用Format function除以10:

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

有关格式字符串的详细信息,请参阅Format function德尔福文档。

请注意,Format使用特定于语言环境的数字格式(特别是小数点分隔符)。


如果你确实需要截断,您需要实现它喜欢自己:

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; 

以Unicode Inno Setup的上述工程只在ANSI版本FloatToStr使用特定语言环境的小数点分隔符,即并不总是.

+0

我用你的实现,而不是格式化字符串。它工作得很好!谢谢!........我很幸运,因为我总是使用Inno Setup Unicode Version .....;) – GTAVLover

1

要截断到第n位简单地乘以10^N,trucate小数部分然后^ N再次

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

如果'1.77'不能以给定的浮点精度表示,这将不起作用。所以特别是它不适用于Single。你会得到'1.769999980927'。它将与'Double'一起工作。但即使使用'Double',你也可能会遇到同样的问题。 –

相关问题