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


回答:


30

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

number_dec = str(number-int(number))[1:]

30
読者のための演習:10以上の数値で機能するようにする
2013年

11
number_dec = str(number-int(number)).split('.')[1]
ライアンアレン

26
これは不必要に複雑なアプローチであるため、反対票を投じます。私が求めた答えは次の答えでした5.55 % 1。これもまた、より一般的に有用な答えです。上記の答えはPython固有のものですが、モジュロ除算アプローチを複数の言語で使用できます。
シチュー2015

3
注:このソリューションは、ドット(.55)を含む文字列を返しますこれは、質問のタイトルが原因で予期しない可能性があります。
T.クリスチャンセン

8
str(5.55 - int(5.55))[1:]質問に記載されている.5499999999999998代わりに戻ります.55
クリスティアンCiupitu 2017

197
5.55 % 1

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

0.550000000001

それ以外の場合は、予想している0.55から少しずれています。


7
に関してはmodf、それは同様に精度をねじ込むことができます:math.modf(5.55)(0.5499999999999998、5.0)を返します。
bereal

1
誰がより速い操作、上記のこの方法、または:float b = a-int(a)かを知っていますか?私は
後者を疑って

4
Raspberry Piでは、このメソッドx%1x-int(x)およびmodf(x)[0]メソッドのほぼ2倍の速さでした(タイミングは平均で1000000回の実行で980ns、1.39us、1.47usでした)。私の価値xは常にプラスだったので、心配する必要はありませんでした。
coderforlife 2017年

確かにモジュールの操作はより高速です。名前の検索を行う必要はありません。一方、int関数を呼び出すと、グローバル変数が検索されます。
Enrico Borba 2017

frac()を持っているだけではない
mckenzm

154

modfを使用します

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

2
良い解決策ですが、math.modf(2.53) = (0.5299999999999998, 2.0)予想される答えは0.53です
Loh卿。

4
@LordLoh。これは浮動小数点の丸めが原因であり、どのメソッドでも発生します。
Rena

@LordLoh。round(0.5299999999999998、2)を使用して0.53を取得してみてください。もう1つの方法は、10進数パッケージからDecimalを使用することです。docs.python.org/2/library/decimal.html
SirJ

57

何について:

a = 1.3927278749291
b = a - int(a)

b
>> 0.39272787492910011

または、numpyを使用します。

import numpy
a = 1.3927278749291
b = a - numpy.fix(a)

33

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

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

コメントのちょっとした メモとして、ネイティブfloatsをまず文字列に変換する必要があります。


元の質問質問者のために:floatはDecimalsに変換する前に文字列に変換する必要があります。したがって、を持っている場合n = 5.55、nは浮動小数点数でありDecimal(str(n)) % 1、小数部分を取得する必要があります。(整数がある場合は必要ありませんが、問題はありません。)

2
@intuited:それは小数である必要はありません、それはフロートのためにも動作します:10.0/3 % 1少なくとも私のシステムで
aherok

2
文字列を使用する代わりに、from_floatを使用できます。d = Decimal.from_float(1.2)
マシュー

@intuited小数部を整数としてどのように取得しますか?to_integer()メソッドを試しましたが、型は10進数のままです。
D1X 2016年

1
@MatthewPurdon-を使用するとDecimal.from_float(1.2)(これはと表記できるようになりDecimal(1.2)ます)、丸めの問題が発生しますが、この回答はこれを回避しようとしました。
ジョンY


5

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

def number_after_decimal(number1):
    number = str(number1)
    if 'e-' in number: # scientific notation
        number_dec = format(float(number), '.%df'%(len(number.split(".")[1].split("e-")[0])+int(number.split('e-')[1])))
    elif "." in number: # quick check if it is decimal
        number_dec = number.split(".")[1]
    return number_dec

number = 5.55; "." in number与えTypeError: argument of type 'float' is not iterableます。そして、あなたはどうしnumber = 1e-5ますか?
マークディキンソン

@マークの質問は、小数点以下の数値を取得するにはどうすればよいですか?したがって、ユーザーは10進表記(科学表記ではなく)の浮動小数点数を期待しています。科学表記のブロックも追加しました
yosemite_k

数は数です。これは、科学表記法である可能性がある数の表現のみです。したがって、「10進表記で浮動」はここではあまり意味がありません。Pythonがそれを見る頃には、それは単なるfloat; Pythonは、それが最初にどの形式で表現されたのかについての知識を保持していません。私のnumber = 1e-5例は、次のような場合にも当てはまります。数値number = 0.00001str表現は科学表記法です。ところで、e+と同様に対処する必要がありますe-
Mark Dickinson、

4
import math
orig = 5.55
whole = math.floor(orig)    # whole = 5.0
frac = orig - whole         # frac = 0.55

>>> frac 0.5499999999999998
macm

4
>>> n=5.55
>>> if "." in str(n):
...     print "."+str(n).split(".")[-1]
...
.55

2
これは、園芸品種の数値では問題ありませんが、科学的表記を必要とするほど大きい(または小さい)数値ではうまく機能しません。

2

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

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

2

後続ゼロが重要な場合があります

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)

これは0.000005に対して何をしますか?
Aditya Patnaik

1

床を使用し、元の数から結果を引きます:

>> 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

5
あなたが行くつもりならimport math、なぜ単に使用しないのmath.modf()ですか?
ire_and_curses 2010年

@ire_and_curses:私は問題の代替ソリューションを提供しています。

1
floorはintへのキャストと同じなので、math.floor(t)をint(t)に置き換えることができます
QuantumKarl

@QuantumKarlいいえ、違います。math.floor(-1.1) == -2しかしint(-1.1) == -1。この質問のために使用するint方が正しいですが。
Lambda Fairy

1

浮動小数点数は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

例:

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

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


これは小数以外の値を返すので良いですが、負の数で壊れます
Meow

残念ながらそれはほとんどの場合機能しません。@ニャー
ローン侯爵


1

単純な演算子除算 '/'および床除算 '//'を使用するだけで、任意のフロートの小数部を簡単に取得できます。

number = 5.55

result = (number/1) - (number//1)

print(result)

0

何について:

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

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


説明はありますか?


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

出力:0.55


0

Python 3で小数点以下の数値を取得するためによく行うことを確認してください。

a=1.22
dec=str(a).split('.')
dec= int(dec[1])


0

別のオプションはrere.findallまたはでモジュールを使用することですre.search

import re


def get_decimcal(n: float) -> float:
    return float(re.search(r'\.\d+', str(n)).group(0))


def get_decimcal_2(n: float) -> float:
    return float(re.findall(r'\.\d+', str(n))[0])


def get_int(n: float) -> int:
    return int(n)


print(get_decimcal(5.55))
print(get_decimcal_2(5.55))
print(get_int(5.55))

出力

0.55
0.55
5

式を簡略化/変更/探索する場合は、regex101.comの右上のパネルで説明されています。必要に応じて、このリンクで、サンプル入力とどのように一致するかを確認することもできます。


ソース

Pythonの減算で追加の浮動小数点数を取り除く方法は?


0

非常に大きな小数部を持つ非常に大きな数は、1を法として小数を取得するときに問題を引き起こす可能性があることを発見しました。

import decimal

>>> d = decimal.Context(decimal.MAX_PREC).create_decimal(
... '143000000000000000000000000000000000000000000000000000000000000000000000000000.1231200000000000000002013210000000'
... )
...
>>> d % 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.DivisionImpossible'>]

代わりに、積分部分をつかんで最初に差し引いて、残りの部分を簡略化しました。

>>> d - d.to_integral()
Decimal('0.1231200000000000000002013210')

0

modfを使用した別の例

from math import modf
number = 1.0124584

# [0] decimal, [1] integer
result = modf(number)
print(result[0])
# output = 0124584
print(result[1])
# output = 1

0

解決策は、モジュロと丸めを使用することです。

import math

num = math.fabs(float(5.55))
rem = num % 1

rnd_by =   len(str(num)) - len(str(int(num))) - 1

print(str(round(rem,rnd_by)))

あなたの出力は0.55になります



-2

別のクレイジーなソリューションは(文字列に変換せずに)です:

number = 123.456
temp = 1

while (number*temp)%10 != 0:
    temp = temp *10
    print temp
    print number

temp = temp /10
number = number*temp
number_final = number%temp
print number_final
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.