Làm thế nào để làm tròn một số dấu phẩy động đến một chữ số thập phân nhất định?


83

Giả sử tôi có 8.8333333333333339và tôi muốn chuyển đổi nó thành 8.84. Làm cách nào tôi có thể thực hiện điều này bằng Python?

round(8.8333333333333339, 2)cho 8.83và không 8.84. Tôi mới làm quen với Python hoặc lập trình nói chung.

Tôi không muốn in nó dưới dạng một chuỗi và kết quả sẽ được sử dụng thêm. Để biết thêm thông tin về sự cố, vui lòng kiểm tra Mẹo lập trình Python của Tim Wilson: Máy tính khoản vay và thanh toán .


4
vòng (8,8333333333333339, 2) sẽ cho 8,83 không bao giờ 8,84.
VGE

42
Tại sao lại là 8,84? 8,8333333 ... nên được làm tròn thành 8,83 khi nhắm đến hai chữ số thập phân.
Tim Pietzcker 23/12/10


1
nếu bạn muốn in giá trị, hãy sử dụng định dạng chẳng hạn như print "% .2f"% 8.8333333333333339. điều này sẽ in giá trị với 2 chữ số
VGE

Tôi đã chỉnh sửa tiêu đề vì đây là kết quả ban đầu cho "python round float" và nó có lẽ không phải là thứ mà hầu hết mọi người đang tìm kiếm. Hy vọng rằng, tiêu đề mới làm cho mọi thứ rõ ràng hơn.
jpmc26

Câu trả lời:


100

8.833333333339(hoặc 8.833333333333334, kết quả của 106.00/12) được làm tròn đúng đến hai chữ số thập phân là 8.83. Về mặt toán học, nó giống như những gì bạn muốn là một hàm trần . Một trong mathmô-đun của Python có tên ceil:

import math

v = 8.8333333333333339
print(math.ceil(v*100)/100)  # -> 8.84

Tương ứng, các hàm sàn và trần thường ánh xạ một số thực với số nguyên lớn nhất trước đó hoặc nhỏ nhất sau đó không có chữ số thập phân - vì vậy, để sử dụng chúng cho 2 chữ số thập phân, số đầu tiên được nhân với 10 2 (hoặc 100) để chuyển số thập phân điểm và sau đó được chia cho nó sau đó để bù đắp.

Nếu bạn không muốn sử dụng mathmô-đun vì lý do nào đó, bạn có thể sử dụng triển khai này (được thử nghiệm tối thiểu) mà tôi vừa viết:

def ceiling(x):
    n = int(x)
    return n if n-1 < x <= n else n+1

Điều này áp dụng như thế nào đối với vấn đề về khoản vay và máy tính thanh toán được liên kết

ảnh chụp màn hình của đầu ra máy tính khoản vay

Từ kết quả đầu ra mẫu, có vẻ như họ đã làm tròn khoản thanh toán hàng tháng, mà nhiều người gọi là tác động của hàm trần. Điều này có nghĩa là mỗi tháng sẽ có nhiều hơn 112 tổng số tiền được thanh toán. Điều đó làm cho khoản thanh toán cuối cùng nhỏ hơn một chút so với bình thường - chỉ để lại số dư chưa thanh toán còn lại 8.76.

Nó sẽ hợp lệ như nhau nếu sử dụng làm tròn thông thường tạo ra khoản thanh toán hàng tháng 8.83và khoản thanh toán cuối cùng cao hơn một chút 8.87. Tuy nhiên, trong thế giới thực, mọi người thường không thích tăng các khoản thanh toán của mình, vì vậy việc làm tròn mỗi khoản thanh toán là một thực tế phổ biến - nó cũng trả lại tiền cho người cho vay nhanh hơn.


67

Điều này là bình thường (và không liên quan gì đến Python) vì 8,83 không thể được biểu diễn chính xác dưới dạng số thực nhị phân, cũng như 1/3 không thể được biểu diễn chính xác ở dạng thập phân (0,333333 ... ad infinitum).

Nếu bạn muốn đảm bảo độ chính xác tuyệt đối, bạn cần decimalmô-đun:

>>> import decimal
>>> a = decimal.Decimal("8.833333333339")
>>> print(round(a,2))
8.83

Không nếu bạn sử dụng printhàm / câu lệnh (tùy thuộc vào phiên bản Python của bạn).
Tim Pietzcker 23/12/10

>>> 106.00/12 => 8.833333333333334
martineau

22

Bạn muốn sử dụng mô-đun thập phân nhưng bạn cũng cần chỉ định chế độ làm tròn. Đây là một ví dụ:

>>> import decimal
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_UP)
Decimal('8.34')
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN)
Decimal('8.33')
>>> 

13

Một cách đơn giản hơn nhiều là chỉ cần sử dụng hàm round (). Đây là một ví dụ.

total_price = float()
price_1 = 2.99
price_2 = 0.99
total_price = price_1 + price_2

Nếu bạn in ra total_price ngay bây giờ, bạn sẽ nhận được

3.9800000000000004

Nhưng nếu bạn đặt nó trong một hàm round () như vậy

print(round(total_price,2))

Đầu ra bằng

3.98

Hàm round () hoạt động bằng cách chấp nhận hai tham số. Đầu tiên là số bạn muốn làm tròn. Thứ hai là số chữ số thập phân cần làm tròn đến.


7

Nếu bạn làm tròn 8,8333333333339 thành 2 số thập phân, câu trả lời đúng là 8,83, không phải 8,84. Lý do bạn nhận được 8.83000000001 là bởi vì 8.83 là một số không thể được định lại chính xác trong hệ nhị phân và nó cung cấp cho bạn số gần nhất. Nếu bạn muốn in nó mà không có tất cả các số 0, hãy làm như VGE nói:

print "%.2f" % 8.833333333339   #(Replace number with the variable?)

6

Cách dễ nhất để làm điều này là sử dụng hàm bên dưới, được tích hợp sẵn:

format()

Ví dụ:

format(1.242563,".2f")

Đầu ra sẽ là:

1.24

Tương tự:

format(9.165654,".1f")

sẽ cho:

9.2

Câu trả lời định dạng đã được đưa ra vào năm 2010 tại đây . Bạn có thể đã cập nhật câu trả lời đó thay thế.
ZF007

5

Nếu bạn muốn làm tròn, 8.84 là câu trả lời không chính xác. 8,833333333333 làm tròn là 8,83 chứ không phải 8,84. Nếu bạn muốn luôn làm tròn, thì bạn có thể sử dụng math.ceil. Thực hiện cả hai kết hợp với định dạng chuỗi, vì bản thân việc làm tròn một số thực không có ý nghĩa.

"%.2f" % (math.ceil(x * 100) / 100)

4

Chỉ để cho bản ghi âm thôi. Bạn có thể làm theo cách này:

def roundno(no):
    return int(no//1 + ((no%1)/0.5)//1)

Ở đó, không cần bao gồm / nhập khẩu


2

Đây là giải pháp của tôi cho vấn đề vòng lên / xuống

< .5  round down

> = .5  round up

import math

def _should_round_down(val: float):
    if val < 0:
        return ((val * -1) % 1) < 0.5
    return (val % 1) < 0.5

def _round(val: float, ndigits=0):
    if ndigits > 0:
        val *= 10 ** (ndigits - 1)
    is_positive = val > 0
    tmp_val = val
    if not is_positive:
        tmp_val *= -1
    rounded_value = math.floor(tmp_val) if _should_round_down(val) else math.ceil(tmp_val)
    if not is_positive:
        rounded_value *= -1
    if ndigits > 0:
        rounded_value /= 10 ** (ndigits - 1)
    return rounded_value

# test
# nr = 12.2548
# for digit in range(0, 4):
#     print("{} decimals : {} -> {}".format(digit, nr, _round(nr, digit)))

# output
# 0 decimals : 12.2548 -> 12
# 1 decimals : 12.2548 -> 12.0
# 2 decimals : 12.2548 -> 12.3
# 3 decimals : 12.2548 -> 12.25

1

Tôi có mã này:

tax = (tax / 100) * price

và sau đó là mã này:

tax = round((tax / 100) * price, 2)

vòng làm việc cho tôi


Bạn đã giải quyết vấn đề của tôi. Tôi chỉ có thể làm tròn với điều này. Không có gì khác hoạt động. renewal_percentage=round(df_x_renewal_count/df_all_count*100)
Kierk


0

Đây là một chức năng đơn giản để làm điều này cho bạn:

def precision(num,x):
    return "{0:.xf}".format(round(num))

Ở đây, num là số thập phân. x là số thập phân mà bạn muốn làm tròn một số thực.

Ưu điểm so với cách triển khai khác là nó có thể điền các số không ở cuối bên phải của số thập phân để tạo một số thập phân lên đến x chữ số thập phân.

Ví dụ 1:

precision(10.2, 9)

sẽ trở lại

10.200000000 (lên đến 9 dấu thập phân)

Ví dụ 2:

precision(10.2231, 2)

sẽ trở lại

10,22 (tối đa hai dấu thập phân)

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.