Làm cách nào để lấy các số sau dấu thập phân?
Ví dụ, nếu tôi có 5.55
, làm thế nào để tôi nhận được .55
?
Làm cách nào để lấy các số sau dấu thập phân?
Ví dụ, nếu tôi có 5.55
, làm thế nào để tôi nhận được .55
?
Câu trả lời:
Một cách tiếp cận dễ dàng cho bạn:
number_dec = str(number-int(number))[1:]
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
cũng là một câu trả lời tổng quát hữu ích hơn - người ta có thể sử dụng phương pháp phân chia mô-đun trong nhiều ngôn ngữ, trong khi câu trả lời trên là dành riêng cho Python.
.55
), mà bạn có thể không mong đợi do tiêu đề câu hỏi!
str(5.55 - int(5.55))[1:]
trả về .5499999999999998
thay vì .55
được đề cập trong câu hỏi.
5.55 % 1
Hãy nhớ rằng điều này sẽ không giúp bạn với các vấn đề làm tròn dấu phẩy động. Tức là bạn có thể nhận được:
0.550000000001
Hoặc nếu không thì giảm một chút so với 0,55 mà bạn đang mong đợi.
modf
nó, nó cũng có thể vặn độ chính xác: math.modf(5.55)
sẽ trở lại (0,5499999999999998, 5,0).
x%1
này nhanh hơn gần như gấp đôi so với phương pháp x-int(x)
và modf(x)[0]
(thời gian là 980ns, 1,39us và 1,47us trung bình trên 1000000 lần chạy). Giá trị của tôi x
luôn tích cực nên tôi không phải lo lắng về điều đó.
Sử dụng modf :
>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
math.modf(2.53) = (0.5299999999999998, 2.0)
câu trả lời dự kiến là 0,53
Thế còn:
a = 1.3927278749291
b = a - int(a)
b
>> 0.39272787492910011
Hoặc, sử dụng numpy:
import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
Sử dụng decimal
mô-đun từ thư viện chuẩn, bạn có thể giữ lại độ chính xác ban đầu và tránh các vấn đề làm tròn dấu phẩy động:
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
Như tất cả các ghi chú trong các nhận xét, trước tiên bạn sẽ phải chuyển đổi float
các s gốc thành chuỗi.
n = 5.55
, n là một số float, và bạn nên làm gì Decimal(str(n)) % 1
để lấy phần phân số. (Điều này không cần thiết nếu bạn có một số nguyên, nhưng điều đó không ảnh hưởng gì.)
10.0/3 % 1
ít nhất là trên hệ thống của tôi
Decimal.from_float(1.2)
(bây giờ có thể được viết là Decimal(1.2)
), bạn sẽ gặp vấn đề làm tròn mà câu trả lời này đang cố gắng tránh.
tương tự như câu trả lời được chấp nhận, cách tiếp cận thậm chí dễ dàng hơn bằng cách sử dụng chuỗi sẽ là
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
cho TypeError: argument of type 'float' is not iterable
. Và bạn sẽ làm gì nếu number = 1e-5
?
float
; Python không lưu giữ bất kỳ kiến thức nào về định dạng ban đầu mà nó được biểu thị. number = 1e-5
Ví dụ của tôi cũng áp dụng tương tự cho number = 0.00001
: str
biểu diễn số trong ký hiệu khoa học. Bạn sẽ muốn để đối phó với e+
cũng như e-
, bằng cách này.
import math
orig = 5.55
whole = math.floor(orig) # whole = 5.0
frac = orig - whole # frac = 0.55
>>> n=5.55
>>> if "." in str(n):
... print "."+str(n).split(".")[-1]
...
.55
Đôi khi các số không ở sau quan trọng
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)
Sử dụng giá trị sàn và trừ kết quả cho số ban đầu:
>> 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
, tại sao không chỉ sử dụng math.modf()
?
math.floor(-1.1) == -2
nhưng int(-1.1) == -1
. Mặc dù cho câu hỏi này sử dụng int
là đúng hơn.
Số thực không được lưu trữ ở định dạng thập phân (cơ số 10). Hãy đọc qua tài liệu python về điều này để tự thỏa mãn tại sao. Do đó, không nên lấy biểu diễn base10 từ một float.
Bây giờ có các công cụ cho phép lưu trữ dữ liệu số ở định dạng thập phân. Dưới đây là một ví dụ sử dụng Decimal
thư viện.
from decimal import *
x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66' # True
y = 0.341343214124443151466
str(y)[-2:] == '66' # False
Thí dụ:
import math
x = 5.55
print((math.floor(x*100)%100))
Điều này sẽ cung cấp cho bạn hai số sau dấu thập phân, 55 từ ví dụ đó. Nếu bạn cần một số bạn giảm 10 phép tính trên hoặc tăng lên tùy thuộc vào số lượng số bạn muốn sau số thập phân.
import math
x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )
Nó chắc chắn đã hoạt động
Thế còn:
a = 1.234
b = a - int(a)
length = len(str(a))
round(b, length-2)
Đầu ra:
print(b)
0.23399999999999999
round(b, length-2)
0.234
Vì vòng được gửi đến một độ dài của chuỗi số thập phân ('0,234'), chúng ta chỉ có thể trừ 2 để không đếm '0' và tìm ra số điểm thập phân mong muốn. Điều này sẽ hoạt động hầu hết các lần, trừ khi bạn có nhiều chữ số thập phân và lỗi làm tròn khi tính toán b ảnh hưởng đến tham số thứ hai của vòng.
Bạn có thể muốn thử điều này:
your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])
Nó sẽ trở lại 0.55
.
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
sản lượng: 0,55
Một tùy chọn khác sẽ là sử dụng re
mô-đun với re.findall
hoặc 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
Nếu bạn muốn đơn giản hóa / sửa đổi / khám phá biểu thức, nó sẽ được giải thích ở bảng trên cùng bên phải của regex101.com . Nếu muốn, bạn cũng có thể xem trong liên kết này , nó sẽ khớp như thế nào với một số đầu vào mẫu.
Làm thế nào để loại bỏ các số thực bổ sung trong phép trừ python?
Tôi nhận thấy rằng những con số thực sự lớn với các phần thực sự lớn có thể gây ra sự cố khi sử dụng modulo 1 để lấy phân số.
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'>]
Thay vào đó, tôi lấy phần tích phân và trừ nó đi trước để giúp đơn giản hóa phần còn lại của nó.
>>> d - d.to_integral()
Decimal('0.1231200000000000000002013210')
Một ví dụ khác sử dụng 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
Một giải pháp là sử dụng modulo và làm tròn.
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)))
Đầu ra của bạn sẽ là 0,55
Bạn có thể sử dụng cái này:
number = 5.55
int(str(number).split('.')[1])