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 round
chức năng hoạt động như mong đợi cần import
thê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 round
hàm khi bạn mong đợi. Một giá trị thuận tiện để add là 1e-X
nơi X
là chiều dài của chuỗi số bạn đang cố gắng sử dụng round
trê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 1
nhiều hơn ... nhưng đơn giản hơn là luôn luôn trừ đi 1
vì đ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 5
trường hợp rìa chỉ xảy ra đối với các giá trị nhất định ở đây .