タイトルが示すように、浮動小数点数を取り、最も近い整数に切り捨てます。ただし、全体ではない場合は、次の整数にどれだけ近いかに関係なく、常に変数を切り捨てたいと思います。これを行う方法はありますか?
タイトルが示すように、浮動小数点数を取り、最も近い整数に切り捨てます。ただし、全体ではない場合は、次の整数にどれだけ近いかに関係なく、常に変数を切り捨てたいと思います。これを行う方法はありますか?
回答:
シンプルな
print int(x)
同様に動作します。
int(-23.3) == 23
これらの1つが機能するはずです。
import math
math.trunc(1.5)
> 1
math.trunc(-1.5)
> -1
math.floor(1.5)
> 1
math.floor(-1.5)
> -2
math.trunc
は整数ですが、の出力math.floor
は浮動小数点です。
type(math.floor(1.51)) -> int
およびtype(math.trunc(1.51)) -> int
現在python 3.6.0
私はあなたがフロア機能を必要とすると思います:
多くの人がを使用するようint(x)
に言っていますが、これはほとんどの場合問題なく動作しますが、少し問題があります。OPの結果が次の場合:
x = 1.9999999999999999
丸めます
x = 2
16日9日以降は丸められます。あなたがそのようなことに遭遇することが決してないだろうと確信しているならば、これは大したことではありません。しかし、それは心に留めておくべきことです。
1.9999999999999999
が実際2.0
には内部float64表現と等しいためです。I. e。64ビットのfloatはその有効桁数を表すことができないため、floatに解析されるとすぐに丸められます。を評価することで確認でき1.9999999999999999 == 2.0
ます。また、等しい演算で浮動小数点数の丸めが行われていると思われる場合は、バイナリ表現をと比較できますstruct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0)
。
int()
。値は既に2.0であり、それは2に喜んでそれを変換する
int()
、それは単にに関係しているの不適切な使用float
として、1.9999999999999999
に切り上げられ2.0
コンパイル時に(しばらくはint()
実行時間に呼ばれています)。あなたは、変数のための右のデータ型を使用する場合は、すべてが期待通りに動作します int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))
提供します1
数学をインポートしたくない場合は、以下を使用できます。
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.
round
この質問が1年前に尋ねられたとき、すでに議論され、回答として拒否されました。OPが欲しいmath.floor
。
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で切り上げてくれませんか?例えば:
number=1.5
round(number)-1
> 1
integer
。