【问题标题】:Delphi : multiply integer with real number(newbie)Delphi:将整数与实数相乘(新手)
【发布时间】:2018-10-29 22:48:37
【问题描述】:

我想将integerreal 相乘。这是我的代码:

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

【问题讨论】:

    标签: delphi integer


    【解决方案1】:

    整数和双精度类型不兼容

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

    使用

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

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

    Round()Trunc() 通常可以满足转换需求。


    如果打算尽可能多地保持相关精度,只需将 deltah 声明为双精度数组(跳过循环/截断)。


    代码中的其他问题:

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

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


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

    【讨论】:

    • 是的(至少需要 4-5 位小数),但据我所知,将 deltah 声明为数组并没有让我做 deltah[i] ,或者我必须声明两个实数?你也碰巧知道什么可能导致这个错误? imgur.com/IpbXgjP 工作直到 ShowMessage('Cota reper este = '+IntToStr(cotareper));然后由于某种原因崩溃
    • 异常来自您的deltah 数组未使用 SetLength() 分配。
    【解决方案2】:

    很简单,你只需乘以。

    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;
    

    【讨论】:

      【解决方案3】:

      deltah 是一个整数数组,您正在尝试进行浮点计算,因此您必须将 deltah 数组的类型更改为双精度数组

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

      【讨论】:

      • 谢谢,我认为它有效,但是当我尝试测试它时,它崩溃了,你知道可能是什么原因吗? imgur.com/IpbXgjP 工作直到 ShowMessage('Cota reper este = '+IntToStr(cotareper));然后由于某种原因崩溃。
      • 数组的第一个元素是索引零,而不是零。尝试 0 到 Num-1 而不是 1 到 Num。或者更好的低(A)到高(A)
      猜你喜欢
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多