先日のAtCorderのB問題、正しくコーディングできているはずなのに、何回やっても不正解でした・・・
###問題文
整数または小数
Xが与えられるので、小数点以下を切り捨てて整数で出力してください。
###制約
0≤X≤10**100
Xは整数、または小数点以下が100桁以下の小数であり、先頭に余計な0は付かない
###回答
import math
X = math.floor(float(input()))
print(X)
84939825309432908832902189.9092309409809091329
84939825309432916635287552
.....................^^^^^
AC× 7
WA× 9
math.floorで15桁以上の小数点以下を切り捨てると結果がずれてしまいました。
###解説を見てみる
以下のように処理すればよいです。
- Xを文字列として受け取る
- Xに小数点が入っているならば、小数点の手前までを出力する
- Xに小数点が入っていないならば、
- Xをそのまま出力する
x = input()
dot_pos = x.find('.')
if dot_pos != -1 : x = x[:dot_pos]
print(x)
84939825309432908832902189849398253094329088329021898493982530943290883290218984939825309432908832902189.84939825309432901292309277877514273172978081784495635302598639373471485769315252334956113938585682444288
84939825309432908832902189849398253094329088329021898493982530943290883290218984939825309432908832902189
なるほど。問題はクリアできました。
なぜmath.floorだとエラーになるのでしょう?
###質問してみました。
Python 3.x - math.floorで15桁以上の数の小数点を切り捨てると何だか変|teratail
ベストアンサー
Pythonのfloatは、CPUのサポートする倍精度浮動小数点数ですが、普通は、有効桁数は2進数で53桁、10進換算で約15.9桁(53 × log2 ≒ 53 × 0.3010)です。つまり、16桁目以降の数字はゴミです。
なるほど。
約15.9桁までしか扱えないので、16桁以降がしっちゃかめっちゃかになるようです。