…そうなんでしょうか。

[上に] [前に] [次に]
ひよこ [E-Mail] 1999/07/14(水) 17:23:34
初歩的な質問ですみません。
perlで1/100と計算すると、0.010000000000000000208となります。
1*0.1とすると0.10000000000000000555となります。
これって、2進数で表せる近似値で計算しているってことなんでしょうか?
そして、これをきれいに計算する(0.01や0.1のように)ことはperlでは無理なのでしょうか?
教えて下さい。

B-Cus 1999/07/14(水) 18:53:38
> …そうなんでしょうか。
まず、こういう意味不明なタイトルを付けるのはやめましょう。
「perlでの小数の扱い」とか、そういうわかりやすいタイトルにしましょう。

本題ですが、0.1は2進表現では循環小数になるので、正しい値を
保持するのは無理です。近似値になるのは仕方ないです。
# もしかしたらちゃんと扱えるパッケージはあるかもしれんけど。

> perlで1/100と計算すると、0.010000000000000000208となります。
ところで、逆に質問なのですが、この値ってどうやって出るんですか?
 % perl -e 'print 1*0.1,"\n",1/100,"\n"'
 0.1
 0.01
となりましたし、printfの%d %u %f %gでもその値は出ませんでした。

もしどうしても0.010000...となってしまうなら、小数点以下第3位まで
しか扱わないなどと決めておいて、
 - 計算は普通に行ない、表示するときにprintf("%.3f",$i) とする
 - ゲタを履かせて常に1000倍した値で計算し、表示するときに文字列として
  小数点をずらず
などの方法があると思います。

ひよこ [E-Mail] 1999/07/15(木) 09:11:56
>まず、こういう意味不明なタイトルを付けるのはやめましょう。
・・・すみませんxxx
送ってから、「やっぱりああいうタイトルはまずいよなぁ」と思いました。
以後気を付けます。

>ところで、逆に質問なのですが、この値ってどうやって出るんですか?
あれ?じゃあ、書き方が悪いのでしょうか?
$num1 = 1 * 0.1;
$num2 = 1 / 100;

print $num1;
print $num2;

としています。

ふじ 1999/07/15(木) 11:44:08
Perlのバージョンによって違うみたい。

私の確認できたところでは、
Perl 5.005_3(Win32)、Perl 5.004_01(Free BSD)だと
0.1
0.01

Perl 4.0(SunOS 5.6)では
0.10000000000000000555
0.010000000000000000208

と表示されました。

ひよこ 1999/07/15(木) 13:16:53
[[解決]]
あ、バージョンで違うんですかぁ。
なるほど。
確かにPerl 4.0です。
ありがとうございました!!
ゲタを履かせて計算させてから…という方法を取ることにします。

[上に] [前に] [次に]