fractions --- Số hữu tỉ

Source code: Lib/fractions.py


Mô-đun fractions cung cấp hỗ trợ cho số học hợp lý.

Một thể hiện Phân số có thể được xây dựng từ một cặp số hữu tỷ, từ một số đơn hoặc từ một chuỗi.

class fractions.Fraction(numerator=0, denominator=1)
class fractions.Fraction(number)
class fractions.Fraction(string)

Phiên bản đầu tiên yêu cầu numeratordenominator là phiên bản của numbers.Rational và trả về một phiên bản Fraction mới có giá trị bằng numerator/denominator. Nếu denominator bằng 0, nó sẽ tăng ZeroDivisionError.

Phiên bản thứ hai yêu cầu number là một phiên bản của numbers.Rational hoặc có phương thức as_integer_ratio() (điều này bao gồm floatdecimal.Decimal). Nó trả về một phiên bản Fraction có cùng giá trị. Giả sử rằng phương thức as_integer_ratio() trả về một cặp số nguyên nguyên tố cùng nhau và số cuối cùng là dương. Lưu ý rằng do các vấn đề thông thường với điểm nhị phân (xem Số học dấu phẩy động: Các vấn đề và hạn chế), đối số của Fraction(1.1) không chính xác bằng 11/10, và do đó Fraction(1.1) sẽ trả về not như người ta mong đợi. (Nhưng hãy xem tài liệu về phương pháp limit_denominator() bên dưới.)

Phiên bản cuối cùng của hàm tạo mong đợi một chuỗi. Hình thức thông thường cho trường hợp này là:

[dấu] tử số ['/' mẫu số]

trong đó sign tùy chọn có thể là '+' hoặc '-' và numeratordenominator (nếu có) là các chuỗi chữ số thập phân (dấu gạch dưới có thể được sử dụng để phân cách các chữ số như với các chữ số nguyên trong mã). Ngoài ra, bất kỳ chuỗi nào đại diện cho một giá trị hữu hạn và được hàm tạo float chấp nhận thì cũng được hàm tạo Fraction chấp nhận. Ở cả hai dạng, chuỗi đầu vào cũng có thể có khoảng trắng ở đầu và/hoặc cuối. Dưới đây là một số ví dụ:

>>> từ phân số nhập Phân số
>>> Phân số(16, -10)
Phân số(-8, 5)
>>> Phân số(123)
Phân số(123, 1)
>>> Phân số()
Phân số(0, 1)
>>> Phân số('3/7')
Phân số(3, 7)
>>> Phân số(' -3/7 ')
Phân số(-3, 7)
>>> Phân số('1.414213 \t\n')
Phân số(1414213, 1000000)
>>> Phân số('-.125')
Phân số(-1, 8)
>>> Phân số('7e-6')
Phân số(7, 1000000)
>>> Phân số (2,25)
Phân số(9, 4)
>>> Phân số (1.1)
Phân số(2476979795053773, 2251799813685248)
>>> từ nhập thập phân Thập phân
>>> Phân số(Thập phân('1.1'))
Phân số(11, 10)

Lớp Fraction kế thừa từ lớp cơ sở trừu tượng numbers.Rational và triển khai tất cả các phương thức và thao tác từ lớp đó. Các phiên bản Fractionhashable và phải được coi là không thể thay đổi. Ngoài ra, Fraction còn có các thuộc tính và phương thức sau:

Thay đổi trong phiên bản 3.2: Hàm tạo Fraction hiện chấp nhận các phiên bản floatdecimal.Decimal.

Thay đổi trong phiên bản 3.9: Chức năng math.gcd() hiện được sử dụng để chuẩn hóa numeratordenominator. math.gcd() luôn trả về loại int. Trước đây, loại GCD phụ thuộc vào numeratordenominator.

Thay đổi trong phiên bản 3.11: Hiện tại, dấu gạch dưới được cho phép khi tạo phiên bản Fraction từ một chuỗi, tuân theo các quy tắc PEP 515.

Thay đổi trong phiên bản 3.11: Fraction triển khai __int__ ngay bây giờ để đáp ứng việc kiểm tra phiên bản typing.SupportsInt.

Thay đổi trong phiên bản 3.12: Cho phép có khoảng trống xung quanh dấu gạch chéo đối với đầu vào chuỗi: Fraction('2 / 3').

Thay đổi trong phiên bản 3.12: Các phiên bản Fraction hiện hỗ trợ định dạng kiểu float, với các kiểu trình bày "e", "E", "f", "F", "g", "G""%"".

Thay đổi trong phiên bản 3.13: Định dạng của các phiên bản Fraction không có loại bản trình bày hiện hỗ trợ điền, căn chỉnh, xử lý ký hiệu, độ rộng tối thiểu và nhóm.

Thay đổi trong phiên bản 3.14: Hàm tạo Fraction hiện chấp nhận bất kỳ đối tượng nào có phương thức as_integer_ratio().

numerator

Tử số của phân số ở số hạng nhỏ nhất.

denominator

Mẫu số của phân số ở dạng tối giản. Đảm bảo là tích cực.

as_integer_ratio()

Trả về một bộ gồm hai số nguyên, có tỷ lệ bằng Phân số ban đầu. Tỷ lệ này ở dạng thấp nhất và có mẫu số dương.

Added in version 3.8.

is_integer()

Trả về True nếu Phân số là số nguyên.

Added in version 3.12.

classmethod from_float(f)

Hàm tạo thay thế chỉ chấp nhận các phiên bản của float hoặc numbers.Integral. Xin lưu ý rằng Fraction.from_float(0.3) không có cùng giá trị với Fraction(3, 10).

Ghi chú

Từ Python 3.2 trở đi, bạn cũng có thể tạo phiên bản Fraction trực tiếp từ float.

classmethod from_decimal(dec)

Hàm tạo thay thế chỉ chấp nhận các phiên bản của decimal.Decimal hoặc numbers.Integral.

Ghi chú

Từ Python 3.2 trở đi, bạn cũng có thể tạo phiên bản Fraction trực tiếp từ phiên bản decimal.Decimal.

classmethod from_number(number)

Hàm tạo thay thế chỉ chấp nhận các phiên bản của numbers.Integral, numbers.Rational, float hoặc decimal.Decimal và các đối tượng có phương thức as_integer_ratio() chứ không phải chuỗi.

Added in version 3.14.

limit_denominator(max_denominator=1000000)

Tìm và trả về Fraction gần nhất với self có mẫu số tối đa max_denominator. Phương pháp này rất hữu ích để tìm các giá trị gần đúng hợp lý cho một số dấu phẩy động đã cho:

>>> from fractions import Fraction
>>> Fraction('3.1415926535897932').limit_denominator(1000)
Fraction(355, 113)

hoặc để khôi phục một số hữu tỷ được biểu diễn dưới dạng số float:

>>> from math import pi, cos
>>> Fraction(cos(pi/3))
Fraction(4503599627370497, 9007199254740992)
>>> Fraction(cos(pi/3)).limit_denominator()
Fraction(1, 2)
>>> Fraction(1.1).limit_denominator()
Fraction(11, 10)
__floor__()

Trả về int <= self lớn nhất. Phương pháp này cũng có thể được truy cập thông qua hàm math.floor():

>>> from math import floor
>>> floor(Fraction(355, 113))
3
__ceil__()

Trả về ít nhất int >= self. Phương pháp này cũng có thể được truy cập thông qua hàm math.ceil().

__round__()
__round__(ndigits)

Phiên bản đầu tiên trả về int gần nhất thành self, làm tròn một nửa thành số chẵn. Phiên bản thứ hai làm tròn self thành bội số gần nhất của Fraction(1, 10**ndigits) (về mặt logic, nếu ndigits âm), một lần nữa làm tròn một nửa về phía chẵn. Phương pháp này cũng có thể được truy cập thông qua hàm round().

__format__(format_spec, /)

Cung cấp hỗ trợ định dạng các phiên bản Fraction thông qua phương thức str.format(), hàm tích hợp format() hoặc Formatted string literals.

Nếu chuỗi đặc tả định dạng format_spec không kết thúc bằng một trong các loại bản trình bày 'e', 'E', 'f', 'F', 'g', 'G' hoặc '%' thì việc định dạng tuân theo các quy tắc chung về điền, căn chỉnh, xử lý ký hiệu, độ rộng tối thiểu và nhóm như được mô tả trong format specification mini-language. Cờ "dạng thay thế" '#' được hỗ trợ: nếu có, nó buộc chuỗi đầu ra luôn bao gồm mẫu số rõ ràng, ngay cả khi giá trị được định dạng là số nguyên chính xác. Cờ không điền '0' không được hỗ trợ.

Nếu chuỗi đặc tả định dạng format_spec kết thúc bằng một trong các loại bản trình bày 'e', 'E', 'f', 'F', 'g', 'G' hoặc '%' thì việc định dạng sẽ tuân theo các quy tắc được nêu cho loại float trong phần Đặc tả định dạng ngôn ngữ nhỏ.

Dưới đây là một số ví dụ:

>>> từ phân số nhập Phân số
>>> định dạng(Phân số(103993, 33102), '_')
'103_993/33_102'
>>> format(Phân số(1, 7), '.^+10')
'...+1/7...'
>>> định dạng(Phân số(3, 1), '')
'3'
>>> format(Phân số(3, 1), '#')
'3/1'
>>> format(Phân số(1, 7), '.40g')
'0,1428571428571428571428571428571428571429'
>>> định dạng(Phân số('1234567.855'), '_.2f')
'1_234_567.86'
>>> f"{Phân số(355, 113):*>20.6e}"
'********3.141593e+00'
>>>giá cũ, giá mới = 499, 672
>>> "{:.2%} tăng giá".format(Fraction(new_price, old_price) - 1)
'Tăng giá 34,67%'

Xem thêm

Mô-đun numbers

Các lớp cơ sở trừu tượng tạo nên tháp số.