web-dev-qa-db-ja.com

小数点以下の数字を取得する方法は?

小数点以下の数字を取得するにはどうすればよいですか?

たとえば、5.55がある場合、.55を取得するにはどうすればよいですか?

あなたのための簡単なアプローチ:

number_dec = str(number-int(number))[1:]
23
lllluuukke
5.55 % 1

これは、浮動小数点の丸めの問題には役立ちません。つまり、次のようになります:

0.550000000001

または、期待する0.55から少し外れます。

157
jer

modf を使用します。

>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
127
Anthony V

どうですか:

a = 1.3927278749291
b = a - int(a)

b
>> 0.39272787492910011

または、numpyを使用して:

import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
49
Jim Brissom

標準ライブラリの decimal モジュールを使用すると、元の精度を維持し、浮動小数点の丸めの問題を回避できます。

>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')

コメントで kindallnotes のように、最初にネイティブfloatsを文字列に変換する必要があります。

31
intuited

Moduloを試してください:

5.55%1 = 0.54999999999999982
6
Juri Robl
import math
orig = 5.55
whole = math.floor(orig)    # whole = 5.0
frac = orig - whole         # frac = 0.55
4

受け入れられた答えと同様に、文字列を使用したさらに簡単なアプローチは

if "." in str(number): # quick check if it is decimal
    number_dec = str(number).split(".")[1]

if 'e-' in str(number): # scientific notation
    number_dec = format(float(number_dec), '.%df'%(len(number_dec.split(".")[1].split("e-")[0])+int(number_dec.split('e-')[1])))
3
yosemite_k
>>> n=5.55
>>> if "." in str(n):
...     print "."+str(n).split(".")[-1]
...
.55
2
ghostdog74
import math

x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )

それは間違いなく働いた

1
Ali

例:

import math
x = 5.55
print((math.floor(x*100)%100))

これにより、小数点の後に2つの数字、その例から55が得られます。 1つの数字が必要な場合は、上記の計算を10減らすか、小数点以下の数字の数に応じて増やします。

1
Frank

Floorを使用して、元の数値から結果を減算します。

>> import math #gives you floor.
>> t = 5.55 #Give a variable 5.55
>> x = math.floor(t) #floor returns t rounded down to 5..
>> z = t - x #z = 5.55 - 5 = 0.55
1
thyrgle

これは私が試した解決策です:

num = 45.7234
(whole, frac) = (int(num), int(str(num)[(len(str(int(num)))+1):]))
1
kurian

末尾のゼロが重要な場合がある

In [4]: def split_float(x):
   ...:     '''split float into parts before and after the decimal'''
   ...:     before, after = str(x).split('.')
   ...:     return int(before), (int(after)*10 if len(after)==1 else int(after))
   ...: 
   ...: 

In [5]: split_float(105.10)
Out[5]: (105, 10)

In [6]: split_float(105.01)
Out[6]: (105, 1)

In [7]: split_float(105.12)
Out[7]: (105, 12)
1
George Fisher

浮動小数点数は10進数(base10)形式で保存されません。これについて pythonのドキュメント を読んで、理由を確認してください。したがって、floatからbase10表現を取得することはお勧めできません。

現在、数値データを10進形式で保存できるツールがあります。以下は、Decimalライブラリーを使用した例です。

from decimal import *

x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66'  # True

y = 0.341343214124443151466
str(y)[-2:] == '66'  # False
1
jpp

これを試してみてください:

your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])

0.55を返します。

0
Ashkan Mirzaee
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)

出力:0.55

0
Sanchit Aluna

どうですか:

a = 1.234
b = a - int(a)
length = len(str(a))

round(b, length-2)

出力:
print(b)
0.23399999999999999
round(b, length-2)
0.234

ラウンドは10進数の文字列の長さ(「0.234」)に送信されるため、マイナス2だけで「0.」をカウントせず、必要な小数点数を算出できます。小数点以下の桁数が多く、bを計算する際の丸め誤差がroundの2番目のパラメーターに干渉しない限り、これはほとんどの場合に機能します。

0
M H