やりたいこと
1÷3
の答えは0.33333...
だが、これを任意の桁まで表示したい。
やってみる
前提として、普通にprint()
で出すと誤差が起きる。
>>> print(1/3)
0.3333333333333333
出力は16桁で止まっている。
これは、floatによる演算の正確性が保証されるのがだいたい16行目まで1であることに由来しており、これ以降は正確ではないということになる。
さて。
方針としては「一桁ずつ計算する」という方式をとる。
筆算を想像すればわかりやすいかも。
- 割る
- 答えを記録する
- あまりを10倍する
- 1へ
この繰り返しで計算していく。
n = 1 # 割られる数
m = 3 # 割る数
k = 10 # 小数部の桁
ans = [str(int(n//m)), ""] # 結果。[0]が整数部、[1]が小数部を保存する
stuck = n - m*int(n//m) # あまり
x = 0 # 割り算の結果(一桁のみ)
while len(ans[1]) < k:
stuck *= 10
x = stuck // m
ans[1] += str(int(x))
stuck -= m * int(x)
# 小数部が存在しない場合は0を差し込んでおく
if len(ans[1])==0:
ans[1] += "0" * k
ところどころx
をint
にキャストしているが、これは割り算の結果が必ずfloatで返されるため。
-
正確には15.95行までだったような気がする(53 * log10 2 =15.95) ↩