高橋(智)です。
前回、前々回と、PHPとRubyで浮動小数点の計算と比較を行うコードを紹介しました(※PHPに関しては一部間違いがあったので、その後修正しました)。
今日は、Delphi(VCL)で同様の処理を行ってみようと思います。まず、「Currency型」を使ってみます。PHPやRubyの時に使用した「1.0」や「0.1」ではなく、「1.2345」や「0.12345」のように、もっと細かい値を使用しています。さて、以下のコードを実行すると何と出力されるでしょうか? 私の環境では「Non-zero:0.0005」と出力されてしまいました。実は「1.234」と「0.1234」の組み合わせでは「Zero:0」と表示されます。
program Project1; {$APPTYPE CONSOLE} uses SysUtils; var am: Currency; sub: Currency; i: Integer; begin am := StrToCurr('1.2345'); sub := StrToCurr('0.12345'); for i := 0 to 9 do am := am - sub; if am = StrToCurr('0.0') then Writeln('Zero:' + CurrToStr(am)) else Writeln('Non-zero:' + CurrToStr(am)); end.
しかしそれでは困るので、DelphiのVCLにも正確な計算を行うためのライブラリが用意されています。では、そのライブラリの関数を使って、上のコードを書き直してみます。
program Project1; {$APPTYPE CONSOLE} uses SysUtils, FMTBcd; var am: TBcd; sub: TBcd; tmp: TBcd; i: Integer; begin am := StrToBcd('1.2345'); sub := StrToBcd('0.12345'); for i := 0 to 9 do begin BcdSubtract(am, sub, tmp); am := tmp; end; if BcdCompare(am, StrToBcd('0.0')) = 0 then Writeln('Zero:' + BcdToStr(am)) else Writeln('Non-zero:' + BcdToStr(am)); end.
このコードでは、StrToBcd関数を使ってTBcdレコードを生成し、BcdSubtract関数を使って引き算を行い、BcdCompare関数を使って値を比較し、最後にBcdToStr関数を使ってTBcdの値を文字列として出力しています。もちろん、忘れずにFMTBcdユニットをusesに追加しておきます。これで「Zero:0」されるようになりました。
この他にも、Delphiから利用できる外部のライブラリもありますが、そのうち紹介したいと思います。
また、C/C++言語で同様の計算を行いたい場合もありますよね? C++Builderでは上のDelphi用の関数がそのまま使えますので、とても助かります。
|