2017-03-19 13 views
-1

私はこれを年齢について把握しようとしていましたが、運はありませんでした。各係数を最も近い整数に丸める必要があります。これを行うにはPython - 最も近い整数への丸め

私は少数DQ = 0.0001をご紹介します。 a [0] = 0.5の場合、round(a [0])= 0.0;これは明らかに良くありません。しかし、これを回避するには、dq:round(a [0] + dq)= round(0.5001)= 1.0;これはいい。このような[2] = -0.5としてネガについて

:ラウンド([2] -dq)=(-0.5001)= -1.0ラウンド。 if文を使ってネガティブを考慮します。これは、正しい値を返しません。私のコードです:

a= 0.5,0.5,-0.5,-0.5 
dq = 0.0001 #small number 

b = round(a[0]+dq), round(a[1]+dq), round(a[2]+dq), round(a[3]+dq) 

if a[0] < 0: 
    b[0] == round(a[0]-dq) 
if a[1] < 0: 
    b[1] == round(a[1]-dq) 
if a[2] < 0: 
    b[2] == round(a[2]-dq) 
if a[3] < 0: 
    b[3] == round(a[3]-dq) 

print(b) 

出力:

(1,1,0,0) 

明らかにそれが機能不全に陥っているif文です。

p.s.後の計算で結果のbを使用できるようにする必要があります。

答えて

0

おそらく、よりスマートな方法でそれを行うことができますが、ここではあなたの問題への迅速な解決策です。まず、forループを使用して、aの要素を丸めます。ところで、aはタプルなので、その要素をループすることができます。

第2に、あなたのロジックは上記の誤りです。 aの要素が正である場合、つまり> 0の場合は、自分で説明したとおり、減算する代わりにdqを追加する必要があります。

In [53]: for i in a: 
    ...:  if i < 0: 
    ...:   print(round(i-dq)) 
    ...:  else: 
    ...:   print(round(i+dq)) 
    ...:   
    ...:   
1.0 
1.0 
-1.0 
-1.0 
1

は、おそらくあなただけのこれはしかし

[1, 1, -1, -1] 

を生み出す

a = [0.5, 0.5, -0.5, -0.5] 
print(list(map(lambda v: int(round(v + (dq if v > 0 else -dq))), a))) 

のようなものを使用することができ、代替は次のようになります。

x = 0.49999 #just slightly less than 0.5 
round(x) 
>>> 0.0 

#first round to 2 digits and then to an "integer" 
round(round(x, 2)) 
>>> 1.0 
+0

おかげで、私はラムダvでコードの第二ラインを使用して考えたことがないでしょうあなたが何か新しい日常を学びます。 – iknowi

0

私が正しくあなたの問題を理解していれば、あなたはnが好きです最も近い整数に切り捨てられる正の数、および最も近い整数に切り上げられる正の数。そのような場合は、math.ceilmath.floorを使用することができます。

import math 

def my_round(x): 
    if x < 0: 
     return math.floor(x) 
    if x >= 0: 
     return math.ceil(x) 


my_round(0.5) # 1 
my_round(-0.5) # -1 
関連する問題