[pgsql-jp: 37168] Re: 消費税計算で失敗しました。

makimoto makimoto @ amtecinc.co.jp
2006年 6月 6日 (火) 14:17:22 JST


川崎さん、こんにちは
> お金の処理を離れて、浮動小数点処理に関する興味としては、
> 
> --------------------------------
> SELECT (1+tax_rate) FROM test;                      -- 1.05000000074506
> SELECT (1::double precision+tax_rate) FROM test;    -- 1.05000000074506
> SELECT tax_rate::double precision FROM test;        -- 0.0500000007450581
> SELECT (1::real+tax_rate) FROM test;                -- 1.05
> SELECT tax_rate::real FROM test;                    -- 0.05
> --------------------------------

コンピュータ関連の人ならほとんどの人が知ってると思いますが…

2の2乗が4
2の1乗が2
2の0乗が1
2の-1乗が0.5
2の-2乗が0.25
2の-3乗が0.125
2の-4乗が0.0625
2の-5乗が0.03125
2の-6乗が0.015625

で0.05以下になるように足していき
最後の2の-18乗のところだけ超えるように<指数部が18桁なので
切り上げたのかな?
足してみると上記と同じような数値になりますね

 0.03125
+0.015625
+0.001953125
+0.0009765625
+0.0001220703125
+0.00006103515625
+7.62939453125E-06
+3.814697265625E-06
+4.76837158203125E-07
+2.38418579101563E-07
+2.98023223876953E-08
+1.49011611938477E-08
+3.72529029846191E-09
合計が
5.00000007450581E-02

1は足しても足さなくても指数部の結果は同じなので…

E-02なので
0.0500000007450581
ですね

> DB 内部はともかく、C でお金を扱う場合は、どうしているんでしょう?
> ・・・話題が脱線しすぎました。
VC6には無いようですが関数を作ればいいだけですから…
VC.NETにはあるようです。

> そうですね、僕もお金は numeric がいいと思います。
バイナリーだと0.1もまともに表現できないので
お金の計算は10進演算したいですね


まきもと




pgsql-jp メーリングリストの案内