Làm tròn đến hai chữ số thập phân trong Python 2.7?


82

Sử dụng Python 2.7 làm cách nào để làm tròn các số của tôi thành hai chữ số thập phân thay vì 10 hoặc lâu hơn?

print "financial return of outcome 1 =","$"+str(out1)

2
Đây có thể là một lon giun. Bạn đang lưu trữ dữ liệu tài chính trong một biến dấu phẩy động và bây giờ muốn làm tròn số đó? Không thể làm tròn chính xác trong hầu hết các trường hợp. Bạn có thể muốn sử dụng số nguyên hoặc Decimals, tùy thuộc vào những gì bạn đang thực sự cố gắng thực hiện.
Tim Pietzcker

Tìm hiểu về công cụ định dạng. Bạn có thể in trực tiếp các giá trị float mà không cần chuyển đổi chúng thành chuỗi.
John Doe

Câu trả lời:


198

Sử dụng chức năng tích hợp round():

>>> round(1.2345,2)
1.23
>>> round(1.5145,2)
1.51
>>> round(1.679,2)
1.68

Hoặc chức năng tích hợp format():

>>> format(1.2345, '.2f')
'1.23'
>>> format(1.679, '.2f')
'1.68'

Hoặc định dạng chuỗi kiểu mới:

>>> "{:.2f}".format(1.2345)
'1.23
>>> "{:.2f}".format(1.679)
'1.68'

Hoặc định dạng chuỗi kiểu cũ:

>>> "%.2f" % (1.679)
'1.68'

giúp đỡ về round:

>>> print round.__doc__
round(number[, ndigits]) -> floating point number

Round a number to a given precision in decimal digits (default 0 digits).
This always returns a floating point number.  Precision may be negative.

2
Phương thức định dạng chuỗi rất hữu ích khi làm việc với Số thập phân. Ví dụDecimal("{:.2f}".format(val))
Patch Rick Walsh

@PatchRickWalsh Hoặc đơn giản hơn Decimal(format(val, '.2f')).
Ashwini Chaudhary

9
Mát mẻ! Tôi không biết về nội trang định dạng đó. Sau khi khám phá thêm, tôi nghĩ đây là cách làm tròn chính xác nhất nếu lỗi dấu phẩy động hoàn toàn không thể chấp nhận được: Decimal('123.345').quantize(Decimal('1.00'), rounding=decimal.ROUND_HALF_UP)cho bạn Decimal('123.35'). Mặt khác, Decimal(format(Decimal('123.345'), '.2f'))cho bạn Decimal('123.34')vì biểu diễn nhị phân của 123.345 nhỏ hơn 123.345.
vá Rick Walsh

47

Vì bạn đang nói về các số liệu tài chính , bạn KHÔNG MUỐN sử dụng số học dấu phẩy động. Bạn nên sử dụng Decimal.

>>> from decimal import Decimal
>>> Decimal("33.505")
Decimal('33.505')

Định dạng đầu ra văn bản với kiểu mới format()(mặc định là làm tròn nửa chẵn):

>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.505")))
financial return of outcome 1 = 33.50
>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.515")))
financial return of outcome 1 = 33.52

Xem sự khác biệt trong làm tròn do không chính xác dấu phẩy động:

>>> round(33.505, 2)
33.51
>>> round(Decimal("33.505"), 2)  # This converts back to float (wrong)
33.51
>>> Decimal(33.505)  # Don't init Decimal from floating-point
Decimal('33.50500000000000255795384873636066913604736328125')

Cách thích hợp để làm tròn giá trị tài chính :

>>> Decimal("33.505").quantize(Decimal("0.01"))  # Half-even rounding by default
Decimal('33.50')

Cũng thường có các loại làm tròn khác trong các giao dịch khác nhau:

>>> import decimal
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_DOWN)
Decimal('33.50')
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_UP)
Decimal('33.51')

Hãy nhớ rằng nếu bạn đang mô phỏng kết quả trả lại, bạn có thể sẽ phải làm tròn ở mỗi kỳ tính lãi, vì bạn không thể trả / nhận phân số xu, cũng như không thể nhận lãi theo phân số xu. Đối với các mô phỏng, việc sử dụng dấu phẩy động khá phổ biến do sự không chắc chắn cố hữu, nhưng nếu làm như vậy, hãy luôn nhớ rằng lỗi là ở đó. Do đó, ngay cả các khoản đầu tư có lãi suất cố định cũng có thể khác một chút về lợi nhuận vì điều này.


5

Bạn cũng có thể sử dụng str.format():

>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23

4

Khi làm việc với đồng xu / số nguyên. Bạn sẽ gặp sự cố với 115 (như $ 1,15) và các số khác.

Tôi đã có một chức năng sẽ chuyển đổi một Số nguyên thành một Pha nổi.

...
return float(115 * 0.01)

Nó hoạt động hầu hết thời gian nhưng đôi khi nó sẽ trả lại một cái gì đó như thế nào 1.1500000000000001.

Vì vậy, tôi đã thay đổi chức năng của mình để trả về như thế này ...

...
return float(format(115 * 0.01, '.2f'))

và điều đó sẽ trở lại 1.15. Không '1.15'hoặc 1.1500000000000001(trả về một số thực, không phải một chuỗi)

Tôi chủ yếu đăng bài này để tôi có thể nhớ những gì tôi đã làm trong trường hợp này vì đây là kết quả đầu tiên trên google.


Như đã chỉ ra trong một câu trả lời khác, đối với dữ liệu tài chính, hãy sử dụng số thập phân, không phải số thực.
Bruno Le Floch

1
Tôi đã chuyển đổi hầu hết mọi thứ thành số nguyên. Nó có vẻ dễ dàng hơn nhiều để làm việc với. Tuy nhiên, tôi đã không làm bất cứ điều gì liên quan đến những phần nhỏ của đồng xu.
teewuane

2

Tôi nghĩ tốt nhất là sử dụng hàm format () :

>>> print("financial return of outcome 1 = $ " + format(str(out1), '.2f'))
// Should print: financial return of outcome 1 = $ 752.60

Nhưng tôi phải nói rằng: không sử dụng vòng hoặc định dạng khi làm việc với các giá trị tài chính.


formatyêu cầu không phải chuỗi cho định dạng f. Nếu không, bạn có một ValueError. Mã đúng là: format(out1, '.2f')không đúc chuỗi
Danius

2

Khi chúng ta sử dụng hàm round (), nó sẽ không cho giá trị chính xác.

bạn có thể kiểm tra nó bằng cách sử dụng vòng (2.735) và vòng (2.725)

hãy sử dụng

import math
num = input('Enter a number')
print(math.ceil(num*100)/100)

Vui lòng thêm một ví dụ bạn đã thử nghiệm, kết quả và bạn nghĩ điều gì sai với chúng.
Liran Funaro

import math num = input ('Nhập một số') numr = float (round (num, 2)) print numr
Midhun MM


0

Một cách giải quyết khá đơn giản là chuyển float thành chuỗi trước, chọn chuỗi con của bốn số đầu tiên, cuối cùng chuyển đổi chuỗi con trở lại float. Ví dụ:

>>> out1 = 1.2345
>>> out1 = float(str(out1)[0:4])
>>> out1

Có thể không quá hiệu quả nhưng đơn giản và hoạt động :)


2
Phương pháp này rất không đáng tin cậy. Nếu giá trị của bạn có nhiều hơn một chữ số trước dấu thập phân, bạn sẽ không nhận được hai chữ số thập phân mong muốn. Bài toán tương tự với một số âm.
André Kuhlmann

0

Làm tròn đến 0,05 tiếp theo, tôi sẽ làm theo cách này:

def roundup(x):
    return round(int(math.ceil(x / 0.05)) * 0.05,2)
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.