…そうなんでしょうか。
[上に]
[前に]
[次に]
ひよこ
[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です。
ありがとうございました!!
ゲタを履かせて計算させてから…という方法を取ることにします。
[上に]
[前に]
[次に]