浮動小数点数を最も近い整数に切り捨てますか?


127

タイトルが示すように、浮動小数点数を取り、最も近い整数に切り捨てます。ただし、全体ではない場合は、次の整数にどれだけ近いかに関係なく、常に変数を切り捨てたいと思います。これを行う方法はありますか?


2
考えられる問題は、IEEE浮動小数点形式が非常に大きな数値を表すことがあり、その結果、1より大きい数値になることです。そのため、xを切り捨てることはできますが、x + 1を切り捨てても、期待した結果が得られません。
dmckee ---元モデレーターの子猫2013

いくつかの例を投稿してください。
Ashwini Chaudhary 2013年

回答:


178

シンプルな

print int(x)

同様に動作します。


7
int(0.6)= 1ではなく0
Helin Wang

39
@HelinWangそれがまさにOPが求めたものです。
Petr Peller、2013年

5
これは最もPython的なアプローチのようです。
Gyan Veda 2014年

23
これは、正の数のためにうまく動作しますが、負の数は切り上げられます:int(-23.3) == 23
アレックス・ライリー

2
600851475143などの整数の範囲を超える数値に対しては機能せず、基本的にメモリエラーのフラグが立てられます。
Muyide Ibukun

77

これらの1つが機能するはずです。

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

14
からの出力math.truncは整数ですが、の出力math.floorは浮動小数点です。
evedovelli 2013年

6
@evedovelli:もうない。type(math.floor(1.51)) -> intおよびtype(math.trunc(1.51)) -> int現在python 3.6.0
SKPS 2017年

4
これらのオプションは「int(x)」よりも明示的であるため、よりPythonicです。
トリスタン

43
x//1

//オペレータは、分割の床を返します。1で除算しても数値は変更されないため、これはfloorと同じですが、インポートは必要ありません。ノート:

  1. これはフロートを返します
  2. これは-∞に向かって丸めます

素晴らしい追加。 int(-1.1) == -1しばらく-1.1//1 == -2.0しかし、decimal.Decimal('-1.1')//1 == decimal.Decimal('-1')(文書化されているように、請求項2のために真実ではないdecimal)、どのように依存するので、//でも、今日は完全に安定して振る舞うではありません。
Tino

28

浮動小数点の結果を取得するには、以下を使用します。

round(x-0.5)

負の数でも機能します。


6
非常に洗練された
Alon


9

多くの人がを使用するようint(x)に言っていますが、これはほとんどの場合問題なく動作しますが、少し問題があります。OPの結果が次の場合:

x = 1.9999999999999999

丸めます

x = 2

16日9日以降は丸められます。あなたがそのようなことに遭遇することが決してないだろうと確信しているならば、これは大したことではありません。しかし、それは心に留めておくべきことです。


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

4
そして、それがまさにあなたの主張であるなら、私は何が悪いのかわかりませんint()。値は既に2.0であり、それは2に喜んでそれを変換する
blubberdiblub

1
OP(またはこれを将来読む人)の意図が何らかの理由で最も近い整数(切り上げ値ではなく)を使用する場合、それは覚えておくべきことです。
lokilindo

3
何の関係もありません@lokilindoしかし、これはint()、それは単にに関係しているの不適切な使用floatとして、1.9999999999999999に切り上げられ2.0 コンパイル時に(しばらくはint()実行時間に呼ばれています)。あなたは、変数のための右のデータ型を使用する場合は、すべてが期待通りに動作します int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))提供します1
ティノ

6

数学をインポートしたくない場合は、以下を使用できます。

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.

ご回答有難うございます。次回は、適切なコード(かっこを右)を記述し、ドキュメントを提供すると、より良い受信が得られます。
Geoff

2
roundこの質問が1年前に尋ねられたとき、すでに議論され、回答として拒否されました。OPが欲しいmath.floor
アダム・スミス

3

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.])

mathモジュールの代わりにnumpyモジュールを使用するだけでも機能すると思います。


1

あなたがこれを解決したかどうかはわかりませんが、私はこの質問に出くわします。小数点を取り除きたい場合は、int(x)を使用すると、すべての小数点が削除されます。round(x)を使用する必要はありません。


1

round(x-0.5)を作成するだけで、フロートの次の切り捨て整数値が常に返されます。do round(x + 0.5)で簡単に切り上げることもできます


-1

とてもシンプルかもしれませんが、マイナス1で切り上げてくれませんか?例えば:

number=1.5
round(number)-1
> 1

4
これは整数全体に対して間違った答えを与えます。たとえば、2.0は2で切り上げ、とあなたは1を引く場合は、誤った結果1.取得
パスカルCuoq

@PascalCuoq私はあなたの問題を理解していません。結果として1.0が必要ですか?OPは明らかに四捨五入したかったため、最も近い値に四捨五入しましたinteger
bad_keypoints 2015年

1
@bad_keypoints OPが2.0から1に丸めたいとは思わない
Pascal Cuoq

@PascalCuoq申し訳ありません。コメントスレッドで回答を振り返ったところです。
bad_keypoints

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.