フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: [TeamJapan] DelphiのBcdライブラリ
DEKO
管理者
投稿数: 2689
[TeamJapan] DelphiのBcdライブラリ
on: 2013/04/08 23:50 Mon

http://blogs.embarcadero.com/teamj/2009/06/15/518/

See Also:
[BCD 演算 (XE2 以降)]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1252

DEKO
管理者
投稿数: 2689
DelphiのBcdライブラリ
on: 2017/01/12 17:48 Thu

高橋(智)です。
前回、前々回と、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用の関数がそのまま使えますので、とても助かります。

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.021 sec.