德尔福:用实数乘以整数(新手)

时间:2015-04-18 16:56:46

标签: delphi integer

我想将integer乘以real个数字。这是我的代码:

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs;

type
  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
 num ,sumadh,sumadist,corectiah :integer;
 cs,cf,dist,deltahprim,deltah,H:Array of integer;
 corectiatest,cotareper:integer;
 kh  :real;

implementation

{$R *.fmx}

procedure TForm2.FormCreate(Sender: TObject);
var
  i: integer;    
begin
  num := 3;
  SetLength(cs, num);
  SetLength(cf, num);
  SetLength(dist, num);
  SetLength(deltahprim, num);
  SetLength(H, num);

  sumadh := 0;
  sumadist := 0;
  cotareper := StrtoInt(InputBox('Cota reper nivelment',
    'Valoare cota in cm', '0'));
  for i := 1 to num do
  begin
    cs[i] := StrtoInt(InputBox('Niveleul nr' + Inttostr(i),
      'Citire spate (cm)', '0'));

    cf[i] := StrtoInt(InputBox('Niveleul nr' + Inttostr(i),
      'Citire fata(cm)', '0'));

    dist[i] := StrtoInt(InputBox('Niveleul nr' + Inttostr(i),
      'Distanta intre mire(cm)', '0'));

    deltahprim[i] := cs[i] - cf[i];
    sumadh := sumadh + deltahprim[i];
    sumadist := sumadist + dist[i];
  end;

  corectiah := -sumadh;
  kh := corectiah / sumadist;

  ShowMessage('Suma deltah = ' + Inttostr(sumadh));
  ShowMessage('Suma distantelor este = ' + Inttostr(sumadist));
  ShowMessage('Corectia este = ' + Inttostr(corectiah));
  ShowMessage('Cota reper este = ' + Inttostr(cotareper));

  for i := 1 to num do
  begin

    deltah[i] := deltahprim[i] + kh * dist[i];
    ShowMessage('delta h compensat = ' + Inttostr(deltah[i]));

  end;
end;

end.

变量kh类似0.0005,需要与dist[i]相乘。但是我无法运行代码。我收到以下错误消息:

  

不兼容的类型是整数和双精度。

是否存在整数到实数的函数?例如。类似于InttoReal

3 个答案:

答案 0 :(得分:3)

  

不兼容的类型整数和双

分配给整数时,必须将整数和浮点值的乘法转换为整数值。

使用

deltah[i] := deltahprim[i] + Round(kh * dist[i]);  // Or Trunc(kh * Dist[i]);

浮点乘以整数会在乘法期间将整数提升为浮点数。结果是一个浮点值,程序员有责任将其转换回整数(当赋值为整数时),因为编译器无法评估乘法的意图。

Round()Trunc()通常涵盖转化需求。


如果目的是尽可能保持相关的精度,只需将deltah声明为double的数组(跳过round / trunc)。


代码中的其他问题:

  • 您必须使用deltah分配SetLength()数组。这是您在评论中提到的异常的可能原因。

  • 所有循环必须从零到num-1,因为动态数组以零索引开始。


启用范围检查并使用调试器单步执行代码。 IDE是查找这些错误的资源丰富的工具。

答案 1 :(得分:1)

很简单,你只需乘法。

var
  i: integer;
  r: real;
  p: real;
begin
  p:= r * i;
end;

只需确保将结果存储在浮点变量中。

如果要将结果存储为整数,则必须进行舍入或截断。

var
  i: integer;
  r: real;
  pi: integer;
begin
  pi:= round(r * i);
end;

答案 2 :(得分:0)

deltah是一个整数数组,你试图得到一个浮点计算,所以你必须将deltah数组的类型更改为double的数组

deltah: array of double;

deltah[i]:=(deltahprim[i]+kh*dist[i]);
ShowMessage('delta h compensat = '+FloatToStr(deltah[i]));