
Ubuntu日本語フォーラム

ログインしていません。
Ubuntu 9.10 を使っています。
このパッケージの perl は v5.10.0 です。
perl スクリプトを作っていて、剰余計算がうまく動作しない症状がありました。
1つの例は
40.8*100%10 の値が「9」となります。「0」を期待して条件分岐を行っている時です。その他xx.8やxx.3でも同様の症状です。
40.8*1000%100 とすれば「0」を返してくれますが、何か別のxx.xの数字で「0」となりません。
最終的に、xx.x*10000%1000 として所望の動作が得られたのですが、皆様のubuntuでは如何でしょうか?
オフライン
perlは組んだことが無いので、本当のことは分かりませんが、小数点の誤差によるものかもしれません。
40.8はコンピュータの世界では無限小数です。
101000.11001100 ... と続きます。
故に計算の打ち切りで40.8より小さい数と判断されているのではないでしょうか。
printfで計算結果が分かりませんか?
オフライン
perlの小数の扱いに関する正確な仕様を知らないのでただの憶測ですが、~.8や~.3が無限小数であるというところに関連してるんじゃないでしょうか?
たとえば、0.8を2進数的に考えると 0.110011001100・・・と循環小数になります、これはつまり0.8=0.75+0.75/16+0.75/16^2+・・・で、0.8=0.79999~という数字になりますね。
単なる憶測なので、識者の方のコメントをお待ちくださいませ
オフライン
どうやらビンゴのようです。http://blog.goo.ne.jp/_hal/e/5ad229ee15 … 5c3df837c2
オフライン
vbkさん gontomoさん
返事をありがとうございます。
確かに小数点の誤差のようです。
しかしperlのように円熟した言語ならこのへんは解決されていると過大に期待していました。
例えば、2.3%3.8 ---> 2 というように、2.3は2に、3.8は3に変換して計算してくれるのですから。
いろいろ試してみました。
$a=40.8
$b=$a*100
print $b ----> 4080
しかし
print int($b) ---> 4079
print $b%10 ---> 9
print int($b*1) ---4079
perlでは文字と数字は自動的に変換されるため型変換の関数がありません。
そこで、#5でお教えいただいた fprintf()を使うしかなさそうです。
$x = sprintf("%.0f", $b)
print $x ---> 4080
print int($x) ---> 4080
print $x%10 ---> 0
勉強になりました。
オフライン