python에서 float를 정수로 변환하는 가장 안전한 방법?
Python의 수학 모듈에는 다음과 같은 편리한 기능이 포함되어 있다.floor
&ceil
이 소수점 그 그 정수를 이러한 함수는 부동 소수점 번호를 취하여 그 아래 또는 그 위에 가장 가까운 정수를 반환한다.그러나 이러한 함수는 답을 부동 소수점 번호로 반환한다.예를 들면 다음과 같다.
import math
f=math.floor(2.3)
지금f
반환:
2.0
반올림 오류(예를 들어 플로트가 1.9999에 해당하는 경우)의 위험을 실행하지 않고 이 플로트에서 정수를 얻는 가장 안전한 방법은 무엇인가? 아니면 다른 기능을 모두 사용해야 할까?
부동 소수점 번호로 나타낼 수 있는 모든 정수는 정확한 표현을 가지고 있다.안전하게 사용할 수 있도록int
그그 과 과 inex inex inex inex inex represent represent represent represent represent represent represent inex represent power represent inex inex inex부정확한 표현은 당신이 2의 힘이 아닌 분모를 가지고 합리적인 숫자를 나타내려고 할 때에만 일어난다.
이 일이 결코 사소한 일이 아니라는 것을!해당 숫자의 크기가 충분히 작을 경우 바닥 = =⋅⌋인 IEEE 부동소수 표시의 속성이지만, 바닥(2.3)이 1일 경우 다른 표현이 가능하다.
위키피디아에서 인용하자면,
절대값이 2보다24 작거나 같은 정수는 정확히 단일 정밀도 형식으로 나타낼 수 있으며, 절대값이 2보다53 작거나 같은 정수는 이중 정밀도 형식으로 정확하게 나타낼 수 있다.
사용하다int(your non integer number)
못을 박을 거야
print int(2.3) # "2"
print int(math.sqrt(5)) # "2"
둥근 기능을 사용할 수 있다.만약 당신이 두 번째 매개변수(숫자)를 사용하지 않는다면, 나는 당신이 원하는 행동을 얻을 것이라고 생각한다.
유휴 출력.
>>> round(2.99999999999)
3
>>> round(2.6)
3
>>> round(2.5)
3
>>> round(2.4)
2
이전의 두 가지 결과를 종합하면 다음과 같다.
int(round(some_float))
이것은 플로트를 상당히 신뢰할 수 있게 정수로 변환한다.
이 일이 결코 사소한 일이 아니라는 것을!해당 숫자의 크기가 충분히 작을 경우 바닥 = =⋅⌋인 IEEE 부동소수 표시의 속성이지만, 바닥(2.3)이 1일 경우 다른 표현이 가능하다.
이 게시물은 왜 그것이 그 범위에서 작동하는지 설명한다.
이중으로 32비트 정수를 문제없이 표현할 수 있다.반올림 문제는 있을 수 없다.더 정확히 말하면, 2와53 -253 사이의 모든 정수를 2와 -2 사이의 정수를 나타낼 수 있다.
간단한 설명:이중은 최대 53개의 이진수까지 저장할 수 있다.더 필요할 때는 오른쪽에 0이 붙는다.
패딩 없이 저장할 수 있는 숫자가 53개로 가장 많은 것으로 뒤를 이었다.당연히 숫자가 적게 필요한 (정수)번호는 모두 정확하게 저장할 수 있다.
111(미팅)111(53개)에 하나를 추가하면 100...000, (53 0).우리가 알고 있는 것처럼, 우리는 53자리를 저장할 수 있고, 그것은 가장 오른쪽의 제로 패딩을 만든다.
여기서53 2가 나온다.
자세한 내용:IEEE-754 부동소수가 어떻게 작동하는지 고려할 필요가 있다.
1 bit 11 / 8 52 / 23 # bits double/single precision
[ sign | exponent | mantissa ]
그 수는 다음과 같이 계산한다(여기서는 관련이 없는 특별한 경우는 제외).
-1sign × 1.152사 ×2exponent - bias
여기서 치우침 = 2exponent - 1 - 1, 즉 이중/단일 정밀도의 경우 각각 1023 및 127이다.
2를X 곱하면 모든 비트 X 위치가 왼쪽으로 이동한다는 것을 알면, 어떤 정수든 소수점 오른쪽에 끝나는 모든 비트가 0이 되어야 한다는 것을 쉽게 알 수 있다.
0을 제외한 모든 정수는 2진수로 다음과 같은 형태를 가진다.
1x...x 여기서 x-es는 MSB(가장 중요한 비트)의 오른쪽에 있는 비트를 나타낸다.
우리가 0을 제외했기 때문에, 항상 하나인 MSB가 있을 것이다. 그래서 저장되지 않는 것이다.정수를 저장하기 위해서는 앞에서 언급한 형태로 가져와야 한다sign: -1 × 1.mantissa ×2exponent - bias.
MSB의 왼쪽을 향해 MSB만 있을 때까지 소수점 위로 비트를 이동시키는 것과 같은 말이다. 그 다음 소수점 오른쪽의 모든 비트가 맨티사에 저장된다.
이를 통해 MSB를 제외하고 최대 52개의 이진수를 저장할 수 있음을 알 수 있다.
모든 비트가 명시적으로 저장되는 가장 높은 숫자는 다음과 같다.
111(omitted)111. that's 53 ones (52 + implicit 1) in the case of doubles.
이를 위해서는 소수점이 52자리 이동되도록 지수를 설정할 필요가 있다.지수를 1씩 늘린다면 소수점 뒤의 왼쪽 오른쪽 자릿수를 알 수 없다.
111(omitted)111x.
관례상 0이다.맨티사 전체를 0으로 설정하면 다음 번호를 받는다.
100(omitted)00x. = 100(omitted)000.
1에 이어 53개의 0, 52개의 저장, 그리고 1개의 지수를 추가했다.
그것은 우리가 모든 정수를 정확하게 나타낼 수 있는 경계(부정수와 양수 모두)를 나타내는 2를53 나타낸다.1을 2에53 보태려면 암묵적인 0(문헌에 의해 표시됨)을 설정해야 했다.x
)은 1에, 그러나 그것은 불가능하다.
문자열 플로트를 int로 변환해야 하는 경우 이 방법을 사용하십시오.
예:'38.0'
로38
이것을 int로 변환하기 위해서 당신은 그것을 int보다 int로 주조할 수 있다.이것은 플로트 문자열이나 정수 문자열에도 적용된다.
>>> int(float('38.0'))
38
>>> int(float('38'))
38
참고: 이렇게 하면 소수점 이후 모든 숫자가 제거된다.
>>> int(float('38.2'))
38
math.floor
항상 정수를 반환하므로int(math.floor(some_float))
반올림 에러가 발생하지 않을 것이다.
라운딩 오류는 다음에서 이미 발생할 수 있음math.floor(some_large_float)
그러나, 처음부터 큰 숫자를 플로트에 저장할 때에도. (큰 숫자는 플로트에 저장할 때 정밀도가 떨어질 수 있다.)
변수를 사용하여 리얼/플로트를 정수로 변환하는 또 다른 코드 샘플."vel"은 실제/플로트 숫자로 다음으로 높은 정수인 "newvel"로 변환된다.
import arcpy.math, os, sys, arcpy.da
.
.
with arcpy.da.SearchCursor(densifybkp,[floseg,vel,Length]) as cursor:
for row in cursor:
curvel = float(row[1])
newvel = int(math.ceil(curvel))
'가장 안전한' 방식을 요구하고 있으니, 상위 답변 이외의 다른 답변을 주겠다.
정밀도를 잃지 않도록 하는 쉬운 방법은 변환 후 값이 동일한지 확인하는 것이다.
if int(some_value) == some_value:
some_value = int(some_value)
예를 들어 플로트가 1.0이면 1.0은 1과 같다.그래서 인트로의 변환은 실행될 것이다.그리고 부유물이 1.1이라면 int(1.1)는 1, 1.1 != 1. 따라서 그 값은 부유물로 남아 정밀도를 잃지 않는다.
참조URL: https://stackoverflow.com/questions/3387655/safest-way-to-convert-float-to-integer-in-python
'IT이야기' 카테고리의 다른 글
RxJS: shareReplay에서 bufferSize란? (0) | 2022.03.23 |
---|---|
TypeScript 파일이 변경될 때 ts-node를 감시하고 다시 로드하는 방법 (0) | 2022.03.23 |
[False, True]에서 "not(참)"이 False를 반환하는 이유는? (0) | 2022.03.23 |
(vue 구성 요소 대신) Javascript 파일에서 작업을 디스패치하는 방법? (0) | 2022.03.22 |
react.js 오류:불변 위반:축소 반응 오류 #37 (0) | 2022.03.22 |