微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

浮点数 – 在Inno Setup Pascal Script中将Round / Truncate浮点数转换为N个小数位

这看起来不像Inno Setup问题,但实际上与其有用的Pascal脚本有关.

我编写了一个代码来进行浮点计算.

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

我不能将Height和Width声明为Extended,Single或Double,因为它们在大多数情况下作为Integer返回,所以我需要将这两个Integers转换为两个Singles.

做完之后:

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一样围绕它呢?

提前致谢.

解决方法

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

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

有关格式字符串的详细信息,请参阅Format function的Delphi文档.

请注意,格式使用特定于区域设置的数字格式(特别是小数分隔符).

如果你真的需要截断,你需要自己实现它:

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使用特定于语言环境的小数分隔符,即并不总是..

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐