Làm thế nào để có được các số sau dấu thập phân?


Câu trả lời:


28

Một cách tiếp cận dễ dàng cho bạn:

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

30
Tập thể dục cho người đọc: làm cho nó làm việc cho số lớn hơn hoặc bằng 10
trực giác

11
number_dec = str(number-int(number)).split('.')[1]
Ryan Allen

28
Phản đối vì đây là một cách tiếp cận phức tạp không cần thiết. Câu trả lời tôi tìm kiếm là câu trả lời tiếp theo, 5.55 % 1cũ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.
Hầm

3
LƯU Ý: Giải pháp này trả về một chuỗi bao gồm dấu chấm ( .55), mà bạn có thể không mong đợi do tiêu đề câu hỏi!
T. Christiansen

8
str(5.55 - int(5.55))[1:]trả về .5499999999999998thay vì .55được đề cập trong câu hỏi.
Cristian Ciupitu,

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


7
Đối với modfnó, nó cũng có thể vặn độ chính xác: math.modf(5.55)sẽ trở lại (0,5499999999999998, 5,0).
bereal

1
có ai biết hoạt động nào sẽ nhanh hơn, phương pháp này được mô tả ở trên, hoặc: float b = a - int (a) không? tôi nghi ngờ sau đó, nhưng muốn để xem nếu có xác nhận
hokkuk

4
Trên Raspberry Pi, phương pháp x%1này nhanh hơn gần như gấp đôi so với phương pháp x-int(x)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 xluôn tích cực nên tôi không phải lo lắng về điều đó.
coderforlife

Chắc chắn hoạt động của mô-đun nhanh hơn. Nó không phải thực hiện bất kỳ tra cứu tên nào. Trong khi việc gọi hàm int thực hiện tra cứu các biến toàn cục.
Enrico Borba

ưa thích không chỉ có một frac ()
mckenzm Ngày

155

Sử dụng modf :

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

2
Giải pháp tốt, nhưng, math.modf(2.53) = (0.5299999999999998, 2.0)câu trả lời dự kiến ​​là 0,53
Lord Loh.

4
@LordLoh. đó là do làm tròn dấu phẩy động và sẽ xảy ra với bất kỳ phương thức nào.
Rena

@LordLoh. Cố gắng sử dụng round (0.5299999999999998, 2) để lấy 0.53 Một cách khác là sử dụng Decimal từ gói thập phân. docs.python.org/2/library/decimal.html
SirJ

57

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)

33

Sử dụng decimalmô-đ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 floatcác s gốc thành chuỗi.


Vì lợi ích của người hỏi câu hỏi ban đầu: float phải được chuyển đổi thành chuỗi trước khi chúng có thể được chuyển đổi thành Số thập phân. Vì vậy, nếu bạn có 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ì.)
kindall

2
@intuited: Nó không cần phải được số thập phân, nó cũng làm việc cho float: 10.0/3 % 1ít nhất là trên hệ thống của tôi
aherok

2
Bạn có thể sử dụng from_float thay vì sử dụng một chuỗi. d = Decimal.from_float (1.2)
Matthew Purdon

@intuited Làm cách nào để lấy phần thập phân dưới dạng số nguyên? Tôi đã thử các phương thức to_integer () nhưng kiểu vẫn là Thập phân.
D1X

1
@MatthewPurdon - Nếu bạn sử dụng 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.
John Y


5

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 numbercho TypeError: argument of type 'float' is not iterable. Và bạn sẽ làm gì nếu number = 1e-5?
Mark Dickinson

@ đánh dấu câu hỏi là Làm cách nào để lấy các số sau dấu thập phân? vì vậy người dùng đang mong đợi phao trong ký hiệu thập phân (ký hiệu không khoa học), tôi đã thêm một khối cho ký hiệu khoa học quá
yosemite_k

A number là một số; nó chỉ là đại diện của một số có thể có trong ký hiệu khoa học. Vì vậy, "float trong ký hiệu thập phân" không có nhiều ý nghĩa ở đây; vào thời điểm Python nhìn thấy nó, nó chỉ là một 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-5Ví dụ của tôi cũng áp dụng tương tự cho number = 0.00001: strbiể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.
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
Điều này có thể chấp nhận được đối với số lượng giống trong vườn, nhưng không hiệu quả đối với số lượng lớn (hoặc nhỏ) đủ để yêu cầu ký hiệu khoa học.
kindall

2

Đây là một giải pháp tôi đã thử:

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

2

Đô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)

cái này làm được gì cho 0,000005?
Aditya Patnaik

1

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

5
Nếu bạn muốn import math, tại sao không chỉ sử dụng math.modf()?
ire_and_curses

@ire_and_curses: Tôi đang cung cấp một giải pháp thay thế cho vấn đề.

1
sàn không giống như đúc đến một int như vậy có thể thay thế Math.floor (t) với int (t)
QuantumKarl

@QuantumKarl Không, chúng khác nhau. math.floor(-1.1) == -2nhưng int(-1.1) == -1. Mặc dù cho câu hỏi này sử dụng intlà đúng hơn.
Lambda Fairy

1

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 Decimalthư viện.

from decimal import *

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

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

1

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.


Đây là tốt đẹp bởi vì nó trả về một giá trị không phân đoạn, nhưng sẽ phá vỡ trên số âm
Meow

Thật không may, nó không hoạt động hầu hết thời gian. @Meow
Marquis of Lorne,


1

Chỉ cần sử dụng phép chia toán tử đơn giản '/' và phép chia tầng '//', bạn có thể dễ dàng nhận được phần phân số của bất kỳ số float nào.

number = 5.55

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

print(result)

0

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ất kỳ lời giải thích?

0

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.


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

sản lượng: 0,55


0

Xem những gì tôi thường làm để lấy các số sau dấu thập phân trong python 3:

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

0

Nếu bạn đang sử dụng gấu trúc:

df['decimals'] = df['original_number'].mod(1)

0

Một tùy chọn khác sẽ là sử dụng remô-đun với re.findallhoặ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))

Đầu ra

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.


Nguồn

Làm thế nào để loại bỏ các số thực bổ sung trong phép trừ python?


0

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

0

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

0

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


0

Bạn có thể sử dụng cái này:

number = 5.55
int(str(number).split('.')[1])

-2

Một giải pháp điên rồ khác là (không cần chuyển đổi trong một chuỗi):

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.