こんにちは、いつもお世話になっております。
環境はDelphi2006です。
現在、四捨五入をしたいと思っているのですが、
ヘルプで検索したところ、
Round()では特殊な四捨五入であるため、
ネット上で公開されている関数を使い開発を進めました。
ですが、四捨五入をする数値の整数部分が
11桁以上になると、マイナス値で答えが出てしまいます。
それ未満であれば正常に四捨五入されています。
もしお分かりの方がいらっしゃいましたら
宜しくお願い致します。
------------------------------
procedure TForm1.Edit1Exit(Sender: TObject);
var
result : longint;
value : extended;
begin
value := strtofloat(Edit1.Text);
if value >= 0 then begin
Result := Trunc(value + 0.5);
end else begin
Result := Trunc(value - 0.5);
end;
edit2.text := inttostr(Result);
end;
文字ベースですね、
エラーチェックはなしです。
function HalfAdjustStr(str:WideString):WideString;
var
i,L:Integer;
DotFound:Boolean;
procedure IncInt(var aStr:WideString; Index:Integer);
begin
if Index=1 then
begin
aStr[Index]:= WChar($30);
aStr := '1' + aStr; //手抜き
end else begin
case Word(aStr[Index]) of
$30 .. $38 : aStr[Index]:= WChar( Word(aStr[Index]) + 1);
$39 : begin
aStr[Index]:= WChar($30);
IncInt(aStr,Index-1);
end;
end;
end;
end;
begin
L:= Length(str);
SetLength(Result,L);
DotFound:=False;
for i := 1 to L do
begin
if str[i]='.' then
DotFound:=True else
begin
if DotFound then
begin
Result[i-1]:=WChar(0);
SetLength(Result,i);
if Word(str[i]) >= $35 then //5より大きい場合
IncInt(Result,i-2);
Exit;
end else
Result[i] := str[i];
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := HalfAdjustStr(Edit1.Text);
end;
11桁というより、LongInt(Integer)では整数部分が2147483647($7FFFFFFF)を
超えるとマイナスになるのは当然。
なので、LongInt(Integer)ではなくて Int64を使うべき。
× result: longint;
○ result: Int64;
ツイート | ![]() |