喫茶XRAYトップページ


[10206] 四捨五入について返信 削除
2016/7/21 (木) 18:32:16 Mr.XRAY
[四捨五入について]
https://forums.embarcadero.com/thread.jspa?threadID=227533&tstart=0

ホント ? やってみました.以下がテストコードです.
この程度のコードは提示した方がいいですね.
できれば,インデント付きで (笑)

動作確認は Windows 7 U64(SP1) + Delphi XE(UP1) Pro
                              + Delphi XE5(UP2) Por 32bit
                              + Delphi XE5(UP2) Por 64bit

結論
貴方の Delphi XE5 は壊れている

procedure TForm1.Button1Click(Sender: TObject);
var
  LValue : Double;
begin
  LValue := RoundAct(565.5);
  Memo1.Lines.Add(FloatToStr(LValue));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  LValue : Double;
begin
  LValue := RoundAct(565.50001);
  Memo1.Lines.Add(FloatToStr(LValue));
end;

//  質問者が提示したコードのコピペ

function TForm1.RoundAct(pATAI: Double): Integer;
begin
if pATAI >= 0 then begin
Result := Trunc(pATAI + 0.5);
end else begin
Result := Trunc(pATAI - 0.5);
end;
end;



[10208] Re:四捨五入について返信 削除
2016/7/22 (金) 08:30:47 おかぽん
▼ Mr.XRAYさん
> [四捨五入について]
> https://forums.embarcadero.com/thread.jspa?threadID=227533&tstart=0

デバッグ上の式評価では 565.5 ですが、計算によって得られた値のため、
565.49999999998.. みたいな値であると予想

RoundActでブレークして、監視式にpATAIを追加。
監視式プロパティのデフォルトから浮動小数点演算に変更。

ホントに565.5ですか?と。

というようなレスを期待している、はらたいr・・・Mr.XRAYさんに3000点

[10209] Re2:四捨五入について返信 削除
2016/7/22 (金) 11:27:33 Mr.XRAY
▼ おかぽんさん

> というようなレスを期待している、

自分はこう確認した.というような反応があると思ったのですが.
予想が外れました.

ところで,www42.tok2.com はまだ復活していないようです.


[10210] Re3:四捨五入について返信 削除
2016/7/22 (金) 16:26:31 おかぽん
▼ Mr.XRAYさん
> 予想が外れました.
あ〜・・・すみません。

procedure TForm1.Button1Click(Sender: TObject);
var
  LValue : Double;
begin
  LValue := RoundAct(565.49999999999994);
  Memo1.Lines.Add(FloatToStr(LValue));
  LValue := RoundAct(565.49999999999995);
  Memo1.Lines.Add(FloatToStr(LValue));
end;

doubleの有効桁数16桁を超えた値で、565と566になることは確認しました。
こんなレスならば、当たりでしたでしょうか。

> ところで,www42.tok2.com はまだ復活していないようです.
そのまま消え去ってネットの海の藻屑となる・・?

[10211] Re4:四捨五入について返信 削除
2016/7/22 (金) 16:45:56 Mr.XRAY
▼ おかぽんさん

> > ところで,www42.tok2.com はまだ復活していないようです.
> そのまま消え去ってネットの海の藻屑となる・・?


ハハハッ.
笑いごとではありませんが,こんなことがあるんですね.


[10215] Re4:四捨五入について返信 削除
2016/7/22 (金) 17:16:11 Mr.XRAY
▼ おかぽんさん

>   LValue := RoundAct(565.49999999999994);

おそらく,計算の過程でそうなっていると思います.
具体的な数値ではなく,変数に格納された値が.

>doubleの有効桁数16桁を超えた値で、565と566になることは確認しました。
>こんなレスならば、当たりでしたでしょうか。


通常は当たり前かも知れませんが,今回質問された方は,反応から判断すると
理解が難しいかも知れません.


[10212] Re:四捨五入について返信 削除
2016/7/22 (金) 16:48:02 Mr.XRAY
> [四捨五入について]
> https://forums.embarcadero.com/thread.jspa?threadID=227533&tstart=0

 
>計算式として、 2000-(2000x0.95x0.755)=565.5
>引数に565.5を渡しています。


ならないよん.

procedure TForm1.Button3Click(Sender: TObject);
var
  LValue : Integer;
begin
  LValue := RoundAct(2000 - (2000 * 0.95 * 0.755));
  Memo1.Lines.Add(IntToStr(LValue));
end;

全角 (漢字) の () は止めてね.X じゃなくて * がいいと思うよ.
って,全角の ( ) と x じゃ,Delphi が認識してくれないと思うのですが.


[10218] Re2:四捨五入について返信 削除
2016/7/22 (金) 20:45:34 Mr.XRAY
>あるいは、このとき、RoundActの最初のほうに、
>
>if pATAI = 565.5 then
>ShowMessage('pATAI は 565.5 です。');
>
>を入れて、値を確認してみるとか・・・・


なるほど,こういう確認方法という手がありましたか.
比較でもいいですね.


INCM/CMT
Cyclamen v3.82