2013-06-17 14 views
54

タイトルが示唆するように、私は浮動小数点数を取ってそれを最も近い整数に丸めたい。しかし、それが全体ではない場合は、次の整数にどれだけ近いかにかかわらず、変数を切り捨てたいと思っています。これを行う方法はありますか?浮動小数点数を最も近い整数に丸めますか?

+1

IEEE浮動小数点形式では数値が非常に大きく、その結果、1より大きい値を表すことができるため、xを丸めることはできますが、x + 1を下げることで期待した結果が得られません。 – dmckee

+0

いくつか例を挙げてください。 –

答えて

17

私はあなたがfloor関数を必要だと思う:

これらの

math.floor(x)

+4

python 2 python 3でfloatを返しますint – tejas

+1

int(math.floor(x))またはfloat(math.floor(x)) – Jeff

46

一つは動作するはずです:

import math 
math.trunc(1.5) 
> 1 
math.trunc(-1.5) 
> -1 
math.floor(1.5) 
> 1 
math.floor(-1.5) 
> -2 
+11

'math.trunc'の出力は整数ですが、 'math.floor'の出力はfloatです。 – evedovelli

+1

@evedovelli:これ以上はない。 'python 3.6.0'の時点で' type(math.floor(1.51)) - > int'と 'type(math.trunc(1.51)) - > int' –

85

シンプル

print int(x) 

も同様に動作します。

+1

int(0.6)= 1ではなく1 –

+14

@HelinWangそれはまさにOPが求めていたものです。 –

+2

これは最もPythonicのアプローチのようです。 –

0

非常に簡単かもしれませんが、1を切り上げてマイナス1にすることはできませんでしたか?

number=1.5 
round(number)-1 
> 1 
+3

これは整数全体に対して間違った答えを与えます。たとえば、2.0の切り上げは2で、1を引くと1の不正確な結果になります。 –

+0

@ PascalCuoq私はあなたの問題を理解していません。結果として1.0を望みますか? OPは丸めたいと思っていたので、最も近い「整数」に番号を付けます。 –

+1

@bad_keypoints OPが2.0から1へと丸めたいとは思わない。 –

4

あなたが数学をインポートしたくない場合は、あなたが使用できます:たとえば

int(round(x))

は、ここでのドキュメントの一部です:

>>> help(round) 
Help on built-in function round in module __builtin__: 

round(...) 
    round(number[, ndigits]) -> floating point number 

    Round a number to a given precision in decimal digits (default 0 digits). 
    This always returns a floating point number. Precision may be negative. 
+0

あなたの答えをありがとう。次回は、適切なコード(閉じ括弧)を書いて、より良いレセプションを得ることができます。 – Geoff

+2

'round'はすでに議論されており、この質問が1年前に尋ねられたときの答えとして拒否されました。 OPは 'math.floor'を望んでいます。 –

0

はしないでくださいあなたがこれを解決したかどうかを知っていますが、私はこの質問に直面します。小数点を取り除きたい場合は、int(x)を使用すれば10進数をすべて削除します。 Theresはround(x)を使用する必要はありません。浮動小数点の結果を得るために

12

は、単純に使用します。

round(x-0.5) 

それは同様に負の数のために動作します。

+0

どのような洗練されたソリューション。ありがとう! –

+0

は非常に洗練された –

5

多くの人が使用することを言う:

 int(x) 

、これはほとんどの場合のために[OK]を動作しますが、少し問題があります。 OPの結果がある場合:

 x = 1.9999999999999999 

それは

それは丸めます16日9後
 x = 2 

に丸めます。あなたがこのような事をしっかり見つけられないと確信しているなら、これは大きな問題ではありません。しかし、それは心に留めておくべきことです。

+7

です。これは、内部float64表現で '1.9999999999999999'が実際には' 2.0'に等しいからです。 I. 64ビット浮動小数点数はその有効数字を表すことができないため、浮動小数点数に変換されるとすぐに丸められます。 '1.9999999999999999 == 2.0'と評価して確認できます。そして、equals演算が浮動小数点数を丸めていると思われる場合は、バイナリ表現を 'struct.pack(" d "、1.9999999999999999)== struct.pack(" d "、2.0)'と比較することができます。 。 – blubberdiblub

+1

それがあなたのポイントなのであれば、 'int()'の何が間違っているのか分かりません。値はすでに2.0であり、それを2に喜んで変換します。 – blubberdiblub

+1

OP(または将来誰かがこれを読み込む人)が何らかの理由で最も近い整数(切り上げ値ではありません)を使用するのであれば、心に留めておくべきこと。 – lokilindo

1

あなたがnumpyのを扱う場合は、あなたが(それはまた、配列に取り組んでいます)にも負の数で動作する、以下のソリューションを使用することができます

import numpy as np 
def round_down(num): 
    if num < 0: 
     return -np.ceil(abs(num)) 
    else: 
     return np.int32(num) 
round_down = np.vectorize(round_down) 

round_down([-1.1, -1.5, -1.6, 0, 1.1, 1.5, 1.6]) 
> array([-2., -2., -2., 0., 1., 1., 1.]) 

私はそれはまたあなたの場合は動作すると思いますnumpyモジュールの代わりにmathモジュールを使用してください。

4
x//1 

//演算子は除算の床を返します。 1で割っても番号は変わらないので、これはfloorと同じですが、インポートは必要ありません。あなたはintを返すことはありません。

関連する問題