2010-10-21 21 views
7

tôi có một loạt các phao nổi và tôi muốn làm tròn số lên đến nhiều nhất tiếp theo của 10cách làm tròn đến vị trí 10 của cao hơn trong python

Ví dụ:

10.2 should be 20 
10.0 should be 10 
16.7 should be 20 
94.9 should be 100 

Tôi chỉ cần nó đi từ khoảng 0-100. Tôi đã thử math.ceil() nhưng chỉ làm tròn đến số nguyên gần nhất.

Xin cảm ơn trước.

Trả lời

12
from math import ceil 

def ceil_to_tens(x): 
    return int(ceil(x/10.0)) * 10 

Sửa: okay, bây giờ mà tôi có một không xứng đáng "Nice câu trả lời" huy hiệu cho câu trả lời này, tôi nghĩ rằng nợ cộng với một giải pháp thích hợp bằng cách sử dụng decimal mô-đun mà không bị những vấn đề này :) Cảm ơn Jeff đã chỉ ra điều này. Vì vậy, một giải pháp sử dụng decimal công trình như sau:

from decimal import Decimal, ROUND_UP 

def ceil_to_tens_decimal(x): 
    return (Decimal(x)/10).quantize(1, rounding=ROUND_UP) * 10 

Tất nhiên đoạn mã trên đòi hỏi x là một số nguyên, một chuỗi hoặc một đối tượng Decimal - nổi sẽ không làm việc như rằng sẽ đánh bại toàn bộ mục đích của việc sử dụng mô-đun decimal.

Thật đáng tiếc là Decimal.quantize không hoạt động đúng với số lớn hơn 1, nó sẽ lưu mẹo lừa nhân đôi.

+1

Bạn cần phải thực sự cẩn thận với điểm nổi tại đây. Bạn nghĩ x là 10.0, nhưng thực sự nó là 10.000 ... 000132 và bạn nhận được câu trả lời mà bạn không mong đợi. Bạn có thể tốt hơn với số học điểm cố định hoặc Thập phân. –

+0

Cảm ơn - nhận xét của bạn đã đánh giá cao sự tò mò của tôi vì vậy tôi đã mở rộng câu trả lời của mình bằng một biến thể sử dụng mô-đun 'thập phân '. –

3
>>> x = 16.7 
>>> int(10 * math.ceil(x/10.0)) 
1

Câu trả lời ở đây đầy nguy hiểm. Ví dụ: 11*1.1 - 2.1 = 10.0, phải không? Nhưng chờ đợi:

>>> x = 11*1.1 - 2.1 
>>> int(ceil(x/10.0)) * 10 
20 
>>> x 
10.000000000000002 
>>> 

Bạn có thể thử này

int(ceil(round(x, 12)/10.0)) * 10 

Nhưng việc lựa chọn số chữ số thập phân làm tròn đến là thực sự khó khăn vì nó là khó dự đoán như thế nào nổi điểm tiếng ồn tích lũy. Nếu nó thực sự quan trọng để có được quyền này tất cả các thời gian, sau đó bạn cần phải sử dụng số học điểm cố định hoặc thập phân.

+0

Kỳ lạ, 'str (11 * 1.1-2.1)' sản lượng ''10 .0'', gợi ý một giải pháp khác, thừa nhận rất xấu:' int (ceil (float (str (x))/10)) * 10'. –

+0

Tôi tin rằng str() viên đạn nổi đến 10 địa điểm. –

0

Nếu bạn đang tìm kiếm một giải pháp mà không liên quan đến bộ phận float, đây cũng là loại sử dụng các module:

def ceil_to_tens_mod(x): 
    tmp = int(ceil(x)) 
    mod10 = tmp % 10 
    return tmp - mod10 + (10 if mod10 else 0) 

Có lẽ một số cách để đơn giản hóa nó, nhưng có bạn đi.

Các vấn đề liên quan