언어/Python
Python 10진수 숫자 자리수 계산 방법
darkdevilness
2024. 1. 22. 13:35
728x90
자리수 ( Majority(정수자리), Minority(소수자리) 를 계산하는 방법이다.
자료를 찾아 보면, 대부분 string으로 계산해서 자리수를 계산한다.
아래 코드는 string 으로 자리수 계산하는 방식과 숫자로 계산하는 방식 두가지를 혼용해서 사용한다.
어떤것을 사용하던 장단점이 존재한다. float으로 계산하면, 소수이하 값이. 16자리까지 나온다. (컴퓨터의 수학적 오류)
그렇기 때문에 예제를 잘 돌려 보고 값을 잘 조정하길 바란다.
사용 용도는 거의 없을 듯하다. ( 아마도 coding 숙제 정도..ㅋㅋㅋ )
이 코드는 에러가 없습니다. string 으로 해야 결과가 원하는 결과가 나오는 듯
왜냐 하면, 소수점이하를 정확하기 표현하지 못하기 때문(예 0.1 = 0.099999...... <= 이렇게 표하기 때문에)
어찌 보면 아래 코드도 명확치 않음. val 값을 받아 올때. 변경될 수도 있음
그래서 이런것은 소주점 자리를 확정짓고 계산을 하거나, 데이터 이동은 string으로 옮겨야 할 때도 있을듯..
이런 것에 의해 정밀한 수학 계산할 때는 이런 오차도 계산해야 함 (정밀 제어는 이런 것으로 인해 잘못된 값이 들어 간다.) 그래서 정밀 제어 할때는 float 로 사용하지 않고 integer로 사용한다.
def digitMinorityZero(self, val: float):
if not isinstance(val, float):
return None, None
MinorityZeroCount = -1
strFloat = f"{val}"
MinorityCount = strFloat[::-1].find('.')
for i, c in enumerate(strFloat[-1 * MinorityCount:]):
if c != '0':
MinorityZeroCount = i+1
break
return MinorityZeroCount
아래 코드는 위에 언급한 에러가 있는 코드 입니다.
def digitCount(self, val):
if not isinstance(val, (int, float)):
return None, None
if isinstance(val, int):
val = float(val)
isInteger = val.is_integer()
decimal, integer = math.modf(val)
# 문자열로 자리수 (Digit Counter)를 계산
strMajority = f"{integer}".find('.')
strMinority = f"{decimal}"[::-1].find('.')
# 10진수 계산으로 자리수 (Digit Counter)를 계산
Quotient, remainder = integer, decimal
Majority, Minority = 1 if Quotient else 0, 0 if isInteger else 1
numerator, denominator = integer, 10
while Quotient:
integer /= denominator
if integer < 1:
break
Majority += 1
numerator, denominator = decimal, 10
while remainder:
decimal *= denominator
if decimal.is_integer():
break
Minority += 1
Majority = max(Majority, strMajority)
Minority = min(Minority, strMinority)
return Majority, Minority
끝.
728x90