プロが教える店舗&オフィスのセキュリティ対策術

数値処理でawkを使い始めているのですが,
int関数を使って小数を切り捨てたいのですが,
以下のような現象が起こって困っています。

print int(9.53*100)
952 ?
print int(9.53*1000)
9530 OK
print int(65.52*1000)
65519 ?
print int(65.52*1000.0+0.1)
65520 ?

int関数はどういう動作をするのかどなたかご教示いただけますでしょうか。
お願いいたします。

A 回答 (1件)

int()は実数値の整数部分だけを取り出す関数です。


合わないのは小数の誤差ですね。コンピューターは2のべき乗の和で表せる数値しか正確に表現できません。べき乗を ^ と書くと。

9.53=2^3+2^0+2^(-1)+2^(-6)+2^(-7)+2^(-8)+2^(-9)…

と無限に続き、正確には表せません。無限に続くのを途中で打ち切って10進数で書くと
9.52999999…
となります。

したがって、100倍して整数部分をとれば952になります。

解決方法としては、
案1) 小数点以下の値が出てこないように工夫して使う
案2) int(x+0.0000001) のようにする
    • good
    • 2
この回答へのお礼

明快なお答えをありがとうございました!
そんな深いこと理由があったのですね。
簡単なCの本には載っていませんでした。
お聞きしなかったら,私には分からなかったと思います。
深く感謝いたします。

お礼日時:2006/03/05 20:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!