2015-09-27 17 views
6

tôi có một danh sách Python chỉ điền với phao:Vòng nổi xuống bằng Python để giữ một không phi thập phân chỉ

list_num = [0.41, 0.093, 0.002, 1.59, 0.0079, 0.080, 0.375] 

tôi cần phải làm tròn danh sách này xuống để có được:

list_num_rounded = [0.4, 0.09, 0.002, 1.5, 0.007, 0.08, 0.3] 

Sự cố: Làm tròn từ 1.59 đến 1.5 thật dễ dàng. Tuy nhiên, vấn đề của tôi là với phao được ít hơn 1.

Câu hỏi: Về cơ bản, tôi cần phải làm tròn tất cả nổi xuống để: nếu float là < 1, sau đó phiên bản tròn chỉ chứa một phi số không. Có cách nào để làm điều này trong Python 2,7?

EDIT:

Attempt: Dưới đây là những gì tôi đã cố gắng:

list_num_rounded = [] 
for elem in list_num: 
    if elem > 0.01 and elem < 0.1: 
     list_num_rounded.append(round(elem,2)) 
    if elem > 0.001 and elem < 0.01: 
     list_num_rounded.append(round(elem,3)) 
    elif elem > 0.1: 
     list_num_rounded.append(round(elem,1)) 

Tuy nhiên, điều này mang lại:

[0.4, 0.09, 0.002, 1.6, 0.008, 0.08, 0.4] 

Nó được làm tròn 1,59, 0,79 và 0,375 lên , nhưng tôi cần một cách để chỉ làm tròn xuống. Có cách nào để làm việc này không?

CHỈNH SỬA 2:

Danh sách sẽ không chứa phao âm. Chỉ có phao dương mới có mặt.

Trả lời

4

Bạn có thể sử dụng logarit để tìm ra số lượng 0 số 0 có, sau đó bạn cần cách làm tròn. Một cách là sử dụng sàn như vậy:

import math 

list_num = [0.41, 0.093, 0.002, 1.59, 0.0079, 0.080, 0.375, 0, 10.1, -0.061] 


def myround(n): 
    if n == 0: 
     return 0 
    sgn = -1 if n < 0 else 1 
    scale = int(-math.floor(math.log10(abs(n)))) 
    if scale <= 0: 
     scale = 1 
    factor = 10**scale 
    return sgn*math.floor(abs(n)*factor)/factor 


print [myround(x) for x in list_num] 

Output:

[0.4, 0.09, 0.002, 1.5, 0.007, 0.08, 0.3] 

Tôi không chắc chắn làm thế nào bạn muốn để xử lý số âm và số lớn hơn 1, điều này vòng số âm và số lớn hơn 1 đến 1dp.

+0

Tôi đã cập nhật bài đăng gốc. Sẽ không có nổi âm trong danh sách. Về con số> 1, xin lỗi tôi nghĩ rằng tôi không hiểu. Bạn đã có một số> 1 trong ví dụ của mình ---> 1.59. Giải pháp của bạn hoạt động cho điều này - chính xác? –

+0

Tôi dường như không thể tìm ra con số> 1. Tui bỏ lỡ điều gì vậy? –

+1

Có, tôi thấy 1.59 trong dữ liệu mẫu. Nhưng, ví dụ, những gì hiện 1059.56 vòng đến? Tôi giả định nó sẽ làm tròn xuống 1 chữ số thập phân (như vậy 1059,5). – reupen

0

Định dạng số phao của bạn thành ký hiệu khoa học có thể hữu ích; sau đó chuyển đổi trở lại các loại float sẽ đạt được những gì bạn muốn. Hãy thử một cái gì đó như:

eval("%.0e" % (.03)) 
eval("%.0e" % (.034)) 
eval("%.0e" % (.0034)) 
+0

Cảm ơn. Nhưng tôi không chắc chắn tôi làm theo. Tôi đã thử 'in eval ("%. 0e "% (.375))' và tôi nhận được 0.4. Bạn có một ví dụ? –

+1

Điều này không hoàn toàn phù hợp với số lớn hơn 1. Nếu bạn đã làm điều này ví dụ: '[eval ("%. 0e "% (phần tử)) cho phần tử trong list_num]', 1.59 trở thành 2.0. – Leo

+0

Bạn đúng; nó sẽ làm tròn số thành một chữ số nhưng không làm tròn chúng xuống. Bạn có thể thử một cái gì đó như 'x ="%. 1e "% (.375); eval (x [: 2] + "0" + x [3:]) 'nếu bạn muốn thử cùng một ý tưởng. –

3

Cho rằng tất cả các phao là tích cực, bạn có thể chuyển đổi chúng thành chuỗi và sử dụng cắt như thế này.

def round(num): 
    working = str(num-int(num)) 
    for i, e in enumerate(working[2:]): 
     if e != '0': 
      return int(num) + float(working[:i+3]) 

list_num = [0.41, 0.093, 0.002, 1.59, 0.0079, 0.080, 0.375] 
new_list = [round(x) for x in list_num] 
print new_list 

in

[0.4, 0.09, 0.002, 1.5, 0.007, 0.08, 0.3] 

Nếu có thể nổi trong danh sách không có giá trị khác không sau số thập phân, bạn sẽ cần phải thêm một kiểm tra đơn giản để xử lý đó.

+0

Một lựa chọn tốt khác. Rất cám ơn cho bài viết của bạn. –

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