Làm thế nào để làm tròn đến 2 số thập phân với Python?


254

Tôi đang nhận được rất nhiều số thập phân trong đầu ra của mã này (bộ chuyển đổi Fahrenheit sang Celsius).

Mã của tôi hiện tại trông như thế này:

def main():
    printC(formeln(typeHere()))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(answer)
    print "\nYour Celsius value is " + answer + " C.\n"



main()

Vì vậy, câu hỏi của tôi là, làm thế nào để tôi làm cho chương trình làm tròn mọi câu trả lời cho vị trí thập phân thứ 2?


6
Một nhận xét nhỏ liên quan đến mã của bạn. Không có lý do gì để giữ giá trị Fahrenheit là toàn cầu, nó là đủ (và tốt hơn) để truyền nó dưới dạng tham số cho các chức năng của bạn. Vì vậy, hãy xóa dòng "Fahrenheit" toàn cầu. Trong hàm formeln, đổi tên tham số thành hàm "Fahreinheit" formeln (Fahreinheit). Đối với làm tròn, bạn chỉ có thể sử dụng các tham số "%" để chỉ hiển thị 2 chữ số đầu tiên và nó sẽ được làm tròn cho các chữ số này. Không có ảnh hưởng đến số chữ số được cung cấp trong công thức trong formeln.
arieli

Câu trả lời:


443

Bạn có thể dùng round hàm, lấy tham số đầu tiên của nó là số và đối số thứ hai là độ chính xác sau dấu thập phân.

Trong trường hợp của bạn, nó sẽ là:

answer = str(round(answer, 2))


21
Đó gọi là làm tròn ngân hàng. Nó làm tròn số chẵn. Đó là trong tiêu chuẩn IEEE 754 cho các số dấu phẩy động. vi.wikipedia.org/wiki/Rounding#Round_half_to_even
rolisz

37
Tôi không chắc điều gì đã khiến mọi người nêu lên nhận xét trên. Đối với hồ sơ, thực tế round(2.675, 2)cho thấy 2.67thay vì không 2.68có gì để làm với việc làm tròn của Ngân hàng.
Đánh dấu Dickinson

3
lưu ý : điều này thay đổi giá trị của câu trả lời. Nếu bạn chỉ muốn làm tròn để hiển thị, hãy đi với câu trả lời của @Johnsyweb - stackoverflow.com/a/20457284/1498405
hardmooth

4
@Johnsyweb Tôi đang thử nó ngày hôm nay, năm sau bài đăng gốc và nó có vẻ hoạt động như mong đợi. Có vẻ tròn () phát triển theo thời gian. Xem bên dưới: vòng (1.379, 2) -> 1.38 vòng (1.372, 2) -> 1.37 vòng (1.375, 2) -> 1.38
NightFurry

81

Sử dụng str.format()'s cú pháp để hiển thị answer với hai chữ số thập phân (mà không thay đổi giá trị cơ bản của answer):

def printC(answer):
    print("\nYour Celsius value is {:0.2f}ºC.\n".format(answer))

Ở đâu:

  • :giới thiệu định dạng spec
  • 0 cho phép đệm không nhận biết ký hiệu cho các loại số
  • .2đặt độ chính xác thành2
  • f hiển thị số dưới dạng số điểm cố định

3
Đây là câu trả lời hữu ích nhất IMO - giữ nguyên giá trị thực và đơn giản để thực hiện! Cảm ơn!
BrettJ

Không chắc chắn tại sao, nhưng định dạng '{: 0.2f}'. (0.5357706) mang lại cho tôi '0.54' (python 3.6)
Noam Peled

3
@NoamPeled: Tại sao không nên? 0.5357...là gần 0.54hơn để 0.53, làm tròn để 0.54có ý nghĩa.
ShadowRanger

"{:0.2f}".format(1.755)-> 1,75 "{:0.2f}".format(1.7551)-> 1,76 - Tuy nhiên, tôi sẽ có cả hai dự kiến ​​sẽ bằng 1,76.
Janothan

(Phiên bản Python:
3.6.10

48

Hầu hết các câu trả lời được đề xuất roundhoặc format. roundđôi khi làm tròn lên và trong trường hợp của tôi, tôi cần giá trị của biến được làm tròn xuống và không chỉ hiển thị như vậy.

round(2.357, 2)  # -> 2.36

Tôi tìm thấy câu trả lời ở đây: Làm thế nào để tôi làm tròn một số dấu phẩy động đến một vị trí thập phân nhất định?

import math
v = 2.357
print(math.ceil(v*100)/100)  # -> 2.36
print(math.floor(v*100)/100)  # -> 2.35

hoặc là:

from math import floor, ceil

def roundDown(n, d=8):
    d = int('1' + ('0' * d))
    return floor(n * d) / d

def roundUp(n, d=8):
    d = int('1' + ('0' * d))
    return ceil(n * d) / d

1
Tôi ủng hộ - đây là những gì tôi đang tìm kiếm; Tôi thích công việc của bạn với python-poloniex: D
Skylar Saveland

2
"các giá trị được làm tròn đến bội số gần nhất của 10 với công suất trừ ndigits;" docs.python.org/3/library/functions.html#round vì vậy không, vòng không phải lúc nào cũng tròn lên, ví dụ:round(2.354, 2) # -> 2.35
Pete Kirkham

@PeteKirkham bạn nói đúng, tôi đã chỉnh sửa câu trả lời của mình để có ý nghĩa và chính xác hơn.
s4w3d0ff

2
-0,54 là câu trả lời đúng cho làm tròn -0,5357706 xuống vì đây là số âm, -0,54 <-0,53
s4w3d0ff

2
Tôi sẽ sử dụng 10**dthay vì int('1' + ('0' * d)).
Jonathon Reinhart

11
float(str(round(answer, 2)))
float(str(round(0.0556781255, 2)))

8

Bạn muốn làm tròn câu trả lời của bạn.

round(value,significantDigit)là giải pháp thông thường để làm điều này, tuy nhiên điều này đôi khi không hoạt động như người ta mong đợi từ góc độ toán học khi chữ số ngay lập tức kém hơn (bên trái) chữ số bạn làm tròn có5 .

Dưới đây là một số ví dụ về hành vi không thể đoán trước này:

>>> round(1.0005,3)
1.0
>>> round(2.0005,3)
2.001
>>> round(3.0005,3)
3.001
>>> round(4.0005,3)
4.0
>>> round(1.005,2)
1.0
>>> round(5.005,2)
5.0
>>> round(6.005,2)
6.0
>>> round(7.005,2)
7.0
>>> round(3.005,2)
3.0
>>> round(8.005,2)
8.01

Giả sử ý định của bạn là làm tròn số truyền thống để thống kê trong các ngành khoa học, đây là một trình bao bọc tiện dụng để có được roundchức năng hoạt động như mong đợi cần importthêm các công cụ như Decimal.

>>> round(0.075,2)

0.07

>>> round(0.075+10**(-2*6),2)

0.08

Aha! Vì vậy, dựa trên điều này, chúng ta có thể tạo ra một chức năng ...

def roundTraditional(val,digits):
   return round(val+10**(-len(str(val))-1), digits)

Về cơ bản, điều này bổ sung một giá trị thực sự nhỏ vào chuỗi để buộc nó phải làm tròn đúng trong các trường hợp không thể đoán trước khi nó không theo quy tắc với roundhàm khi bạn mong đợi. Một giá trị thuận tiện để add là 1e-Xnơi Xlà chiều dài của chuỗi số bạn đang cố gắng sử dụng roundtrên cộng 1.

Cách tiếp cận sử dụng 10**(-len(val)-1)là có chủ ý, vì đây là số nhỏ nhất mà bạn có thể thêm vào để buộc thay đổi, đồng thời đảm bảo rằng giá trị bạn thêm không bao giờ thay đổi làm tròn ngay cả khi .thiếu số thập phân . Tôi có thể sử dụng chỉ 10**(-len(val))với một điều kiện if (val>1)để trừ đi 1nhiều hơn ... nhưng đơn giản hơn là luôn luôn trừ đi 1vì điều đó sẽ không thay đổi nhiều phạm vi số thập phân có thể áp dụng mà cách giải quyết này có thể xử lý đúng. Cách tiếp cận này sẽ thất bại nếu các giá trị của bạn đạt đến giới hạn của loại, điều này sẽ thất bại, nhưng đối với gần như toàn bộ phạm vi của các giá trị thập phân hợp lệ, nó sẽ hoạt động.

Vì vậy, mã hoàn thành sẽ là một cái gì đó như:

def main():
    printC(formeln(typeHere()))

def roundTraditional(val,digits):
    return round(val+10**(-len(str(val))-1))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(roundTraditional(answer,2))
    print "\nYour Celsius value is " + answer + " C.\n"

main()

... sẽ cung cấp cho bạn kết quả mà bạn mong đợi.

Bạn cũng có thể sử dụng thư viện thập phân để thực hiện điều này, nhưng trình bao bọc tôi đề xuất đơn giản hơn và có thể được ưa thích trong một số trường hợp.


Chỉnh sửa: Cảm ơn Blckknght đã chỉ ra rằng 5trường hợp rìa chỉ xảy ra đối với các giá trị nhất định ở đây .


6

Chỉ cần sử dụng định dạng với% .2f sẽ cung cấp cho bạn làm tròn xuống 2 số thập phân.

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

4

Bạn có thể sử dụng toán tử định dạng chuỗi của python "%". "% .2f" có nghĩa là 2 chữ số sau dấu thập phân.

def typeHere():
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(Fahrenheit):
    Celsius = (Fahrenheit - 32.0) * 5.0/9.0
    return Celsius

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

def main():
    printC(formeln(typeHere()))

main()

http://docs.python.org/2/l Library / stdtypes.html # String-formatted


4

Bạn có thể sử dụng toán tử tròn cho tối đa 2 thập phân

num = round(343.5544, 2)
print(num) // output is 343.55

3

Bạn có thể sử dụng chức năng tròn.

round(80.23456, 3)

sẽ cho bạn câu trả lời là 80.234

Trong trường hợp của bạn, sử dụng

answer = str(round(answer, 2))

Hi vọng điêu nay co ich :)


2

Nếu bạn cần tránh vấn đề dấu phẩy động trên số làm tròn cho kế toán, bạn có thể sử dụng vòng tròn.

Bạn cần cài đặt numpy:

pip install numpy

và mã:

import numpy as np

print(round(2.675, 2))
print(float(np.round(2.675, 2)))

in

2.67
2.68

Bạn nên sử dụng nó nếu bạn quản lý tiền với làm tròn hợp pháp.


1

Đây là một ví dụ mà tôi đã sử dụng:

def volume(self):
    return round(pi * self.radius ** 2 * self.height, 2)

def surface_area(self):
    return round((2 * pi * self.radius * self.height) + (2 * pi * self.radius ** 2), 2)

1

Không chắc chắn tại sao, nhưng định dạng '{: 0.2f}' (0,5357706) mang lại cho tôi '0,54'. Giải pháp duy nhất phù hợp với tôi (python 3.6) là:

def ceil_floor(x):
    import math
    return math.ceil(x) if x < 0 else math.floor(x)

def round_n_digits(x, n):
    import math
    return ceil_floor(x * math.pow(10, n)) / math.pow(10, n)

round_n_digits(-0.5357706, 2) -> -0.53 
round_n_digits(0.5357706, 2) -> 0.53

Đây là cắt ngắn, không làm tròn.
ShadowRanger


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.