2016-08-11 98 views
2

來進一步解釋我的標題:我有一個浮動陣列,我想四捨五入,但是,我想將數字四捨五入成爲不是最接近的整數。例如,讓我們說,我想這些數字要四捨五入到是2本的倍數取整就是我:如何將浮點數轉換爲縮放整數?

Temp = np.around(data,0) 

data是float數組。數字四捨五入爲最接近的整數,但我希望他們要舍入的2我的目標最接近的倍數:

0.9 - > 0

1.1 - > 2

謝謝!

+0

是不是1的一個因子? – Jeremy

+0

這沒有一個通用的方法..即沒有「舍入到最近的斐波那契數」。你是否特別想要「最接近2的倍數」,或者你只對一般方法的答案感興趣? – tom10

+0

讓我們說2具體,因爲我可以找出如果需要從那裏改變它,@ tom10 – jstack

回答

3

二的倍數是直截了當:

x = np.array([0.9, 1.1, 10.2, 7.4]) 

2*np.round(x/2) # array([ 0., 2., 10., 8.]) 

但是有沒有一個通用的方法來此。例如,沒有「繞到最近的斐波納契數」的obvoius。考慮函數f(x)=2*x的倍數2的公式:1)首先應用f的倒數(在這種情況下除數),2)然後round,3)然後應用f得出結果。爲此,f必須存在,具有相反的結果,並且結果也必須是int;所以它只適用於一些功能。

+0

多麼偉大,但簡單而詳細的答案。非常感謝,夥伴,這完全解決了我的問題! – jstack

+0

@Tom10:但許多語言都有一個「最接近甚至最接近的圓」(也稱爲「銀行家四捨五入」,儘管銀行家通常不會這樣),並且根據定義甚至2的倍數。有沒有辦法設置默認舍入模式? –

+0

@ tom10,不,顯然沒有。相反,你必須運用技巧來獲得你想要的。 –

1

以下是這樣做的一種方式:

import math 

data = [0.9, 1.1, 10.2, 7.4] 

rounded_numbers = [] 

for num in data: 

    rounded_up_num = math.ceil(num) 

    if rounded_up_num % 2 == 0: 
     rounded_num = rounded_up_num 
    else: 
     rounded_num = math.floor(num) 

    rounded_numbers.append(int(rounded_num)) 

print rounded_numbers # [0, 2, 10, 8] 
+0

似乎是一個很好的方法。但是,如果只評估一次'math.ceil(num)',執行速度會更快。 –

+0

好的答案,但有點過於複雜,因爲它導致了我必須修復的一些錯誤。謝謝,雖然。 – jstack

+0

@ChrisMueller,編輯:) –