LoginSignup
1
1

More than 3 years have passed since last update.

【解決】math.floorで15桁以上の数の小数点を切り捨てると何だか変

Posted at

先日のAtCorderのB問題、正しくコーディングできているはずなのに、何回やっても不正解でした・・・

B - Round Down

問題文

整数または小数
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桁以降がしっちゃかめっちゃかになるようです。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1