喫茶XRAYトップページ


[4913] FormatFloatのおかしな動作返信 削除
2011/6/22 (水) 14:25:27 たてぐや
 皆さんこんにちは。
 先日来取りかかっていた印刷関係のプログラムが一段落して、またplPrevで
ガリガリコードを書く方に戻ったのですが、FormatFloat関数の結果がおかしい
のです。

     Textout(1250,1620,FormatFloat('###.#',y7 - y8));        //35.65
     Textout(1250,1750,FormatFloat('###.#',y9 - y10)); //14.55

 これだと関数の返り値はそれぞれ35.7と14.6になるはずです。ところが実際
に返ってくるのは35.6と14.5になってしまうのです。確認のために新しいプロ
ジェクトを作って試してみると正しく35.7と14.6が戻ってきます。なんとも理
解できません。なにかの絡みでFormatFLoatの返り値が四捨五入ではなくて切り
捨てになってしまっているのでしょうか?

[4915] Re:FormatFloatのおかしな動作返信 削除
2011/6/22 (水) 16:41:23 Mr.XRAY
▼ たてぐやさん

> 解できません。なにかの絡みでFormatFLoatの返り値が四捨五入ではなくて切り
> 捨てになってしまっているのでしょうか?


むむむ.なんなんでょう.さて.


[4921] Re:FormatFloatのおかしな動作返信 削除
2011/6/22 (水) 23:44:12 DEKO 〔HomePage
こんにちは。

端数の誤差があるので、
1.10倍
2.Trunc()
3.10で割る
したものを入れるか、あるいは...

小数点 1 位 (とか 2 位とか) までしか使わないのなら、
変数に Double ではなく Currency を使い、
FormatFloat() ではなく、FormatCurr() を使うとお望みの結果になると思います。


[4923] Re:FormatFloatのおかしな動作返信 削除
2011/6/23 (木) 05:53:58 Mr.XRAY
▼ たてぐやさん

>  これだと関数の返り値はそれぞれ35.7と14.6になるはずです。

分かりません!! と言うツッコミは置いていて.
浮動小数点がらみは,いろいろ複雑です.

[890_計算誤差(数値計算の誤差)と多倍長演算]
http://mrxray.on.coocan.jp/Delphi/plSamples/890_CalcError.htm

DEKOさんの言われるような方法で処理するしかないと思いますね.


[4931] Re2:FormatFloatのおかしな動作返信 削除
2011/6/24 (金) 18:17:14 たてぐや
▼ Mr.XRAYさん
▼ DEKOさん

 ありがとうございます。結局うまくいかないので、自前で四捨五入する関数
を作って解決しました。

[4942] Re3:FormatFloatのおかしな動作返信 削除
2011/6/25 (土) 16:08:23 Mr.XRAY
>  自前で四捨五入する関数

そういえば,Delphi 6以降でしたら,SimpleRoundTo関数というのがあります.
でも,私もそうですが,昔から四捨五入の関数つくっていますから,わざわざ
使う人はあまりいないかも知れません.

http://mrxray.on.coocan.jp/Delphi/plSamples/890_CalcError.htm#06

[4943] Re4:FormatFloatのおかしな動作返信 削除
2011/6/26 (日) 17:34:37 たてぐや
▼ Mr.XRAYさん

> 使う人はあまりいないかも知れません.

 四捨五入の関数ははるか昔、BASICで書いたものをそのままPASCALで書き換え
ただけです。小数点以下1桁なら10倍して0.5足して10で割る、という極めて単
純なものです。こういう基本的なものはみんなMyLib.pasユニットにまとめてあ
るので、usesするだけなんですが、FormatFloatにこだわりすぎました。

INCM/CMT
Cyclamen v3.82