小数点以下の数値を取得するにはどうすればよいですか?
たとえば、私が持っている場合、どうすれば5.55
入手でき.55
ますか?
小数点以下の数値を取得するにはどうすればよいですか?
たとえば、私が持っている場合、どうすれば5.55
入手でき.55
ますか?
回答:
あなたのための簡単なアプローチ:
number_dec = str(number-int(number))[1:]
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
。これもまた、より一般的に有用な答えです。上記の答えはPython固有のものですが、モジュロ除算アプローチを複数の言語で使用できます。
.55
)を含む文字列を返します。これは、質問のタイトルが原因で予期しない可能性があります。
str(5.55 - int(5.55))[1:]
質問に記載されている.5499999999999998
代わりに戻ります.55
。
5.55 % 1
これは、浮動小数点の丸めの問題には役立ちません。つまり、次のようになります。
0.550000000001
それ以外の場合は、予想している0.55から少しずれています。
modf
、それは同様に精度をねじ込むことができます:math.modf(5.55)
(0.5499999999999998、5.0)を返します。
x%1
はx-int(x)
およびmodf(x)[0]
メソッドのほぼ2倍の速さでした(タイミングは平均で1000000回の実行で980ns、1.39us、1.47usでした)。私の価値x
は常にプラスだったので、心配する必要はありませんでした。
math.modf(2.53) = (0.5299999999999998, 2.0)
予想される答えは0.53です
decimal
標準ライブラリのモジュールを使用すると、元の精度を維持し、浮動小数点の丸めの問題を回避できます。
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
n = 5.55
、nは浮動小数点数でありDecimal(str(n)) % 1
、小数部分を取得する必要があります。(整数がある場合は必要ありませんが、問題はありません。)
10.0/3 % 1
少なくとも私のシステムで
Decimal.from_float(1.2)
(これはと表記できるようになりDecimal(1.2)
ます)、丸めの問題が発生しますが、この回答はこれを回避しようとしました。
受け入れられた答えと同様に、文字列を使用したさらに簡単なアプローチは
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
ますか?
float
; Pythonは、それが最初にどの形式で表現されたのかについての知識を保持していません。私のnumber = 1e-5
例は、次のような場合にも当てはまります。数値number = 0.00001
のstr
表現は科学表記法です。ところで、e+
と同様に対処する必要がありますe-
。
>>> n=5.55
>>> if "." in str(n):
... print "."+str(n).split(".")[-1]
...
.55
後続ゼロが重要な場合があります
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)
床を使用し、元の数から結果を引きます:
>> 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
import math
、なぜ単に使用しないのmath.modf()
ですか?
math.floor(-1.1) == -2
しかしint(-1.1) == -1
。この質問のために使用するint
方が正しいですが。
浮動小数点数は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
import math
x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )
それは間違いなくうまくいった
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
出力:0.55
別のオプションはre
、re.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の右上のパネルで説明されています。必要に応じて、このリンクで、サンプル入力とどのように一致するかを確認することもできます。
非常に大きな小数部を持つ非常に大きな数は、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')
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
解決策は、モジュロと丸めを使用することです。
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になります