四捨五入をするには


トリコ  2009-03-14 02:33:04  No: 33638

こんにちは、いつもお世話になっております。
環境は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;


monaa  2009-03-14 03:06:37  No: 33639

文字ベースですね、
エラーチェックはなしです。

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;


むむむ  2009-03-14 03:17:10  No: 33640

11桁というより、LongInt(Integer)では整数部分が2147483647($7FFFFFFF)を
超えるとマイナスになるのは当然。
なので、LongInt(Integer)ではなくて Int64を使うべき。

×  result: longint;
○  result: Int64;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加