개발/Python

Python에서 소수점 세 자리로 자르기

MinorMan 2021. 4. 20. 07:35
반응형

<질문>

1324343032.324는 어떻게 받습니까?

아래에서 볼 수 있듯이 다음은 작동하지 않습니다.

>>1324343032.324325235 * 1000 / 1000
1324343032.3243253
>>int(1324343032.324325235 * 1000) / 1000.0
1324343032.3239999
>>round(int(1324343032.324325235 * 1000) / 1000.0,3)
1324343032.3239999
>>str(1324343032.3239999)
'1324343032.32'

<답변1>

추가로 사용할 수 있습니다.float()당신이 그것을 보존하고 싶다면 주위에float.

%.3f'%(1324343032.324325235)

<답변2>

다음 함수를 사용하여 숫자를 설정된 소수 자릿수로자를 수 있습니다.

import math
def truncate(number, digits) -> float:
    stepper = 10.0 ** digits
    return math.trunc(stepper * number) / stepper

용법:

>>> truncate(1324343032.324325235, 3)
1324343032.324

<답변3>

다른 해결책을 찾았습니다 ( "string witchcraft"해결 방법보다 더 효율적이어야합니다).

>>> import decimal
# By default rounding setting in python is decimal.ROUND_HALF_EVEN
>>> decimal.getcontext().rounding = decimal.ROUND_DOWN
>>> c = decimal.Decimal(34.1499123)
# By default it should return 34.15 due to '99' after '34.14'
>>> round(c,2)
Decimal('34.14')
>>> float(round(c,2))
34.14
>>> print(round(c,2))
34.14

About decimals module

About rounding settings


<답변4>

이건 어때요:

In [1]: '%.3f' % round(1324343032.324325235 * 1000 / 1000,3)
Out[1]: '1324343032.324'

중복 가능성round() in Python doesn't seem to be rounding properly

[편집하다]

추가 의견이 주어지면 다음을 수행하고 싶을 것입니다.

In : Decimal('%.3f' % (1324343032.324325235 * 1000 / 1000))
Out: Decimal('1324343032.324')

부동 소수점 정확도는 사용자가 원하는 것이 아닙니다.

In : 3.324
Out: 3.3239999999999998

(모든 예제는 Python 2.6.5에 있습니다.)


<답변5>

'% .3f'% (1324343032.324325235)

이 특별한 경우에만 괜찮습니다.

숫자를 조금 변경하면됩니다.

1324343032.324 7 25235

그리고:

'%.3f'%(1324343032.324725235)

당신에게 준다1324343032.325

대신 이것을 시도하십시오.

def trun_n_d(n,d):
    s=repr(n).split('.')
    if (len(s)==1):
        return int(s[0])
    return float(s[0]+'.'+s[1][:d])

다른 옵션trun_n_d:

def trun_n_d(n,d):
    dp = repr(n).find('.') #dot position
    if dp == -1:  
        return int(n) 
    return float(repr(n)[:dp+d+1])

또 다른 옵션 (a짧막 한 농담하나)trun_n_d[이것은 ''는및 '' 이다int] :

def trun_n_d(n,d):
    return (  n if not n.find('.')+1 else n[:n.find('.')+d+1]  )

trun_n_dPython 2.7 및 Python 3.6 모두에서 원하는 출력을 제공합니다.

trun_n_d (1324343032.324325235,3)보고1324343032.324

마찬가지로,trun_n_d (1324343032.324 7 25235,3)보고1324343032.324

참고 1Python 3.6 (및 아마도 Python 3.x)에서는 다음과 같이 잘 작동합니다.

def trun_n_d(n,d):
    return int(n*10**d)/10**d

그러나 이런 식으로 둥근 유령은 항상 주변에 숨어 있습니다.

노트 2이와 같은 상황에서파이썬반올림 및 정밀도 부족과 같은의 수 내부가지고있다사용하는 것보다 훨씬 낫습니다int짝; 당신은 항상 당신의 번호를흙손끝에.


<답변6>

십진 모듈을 사용하십시오. 그러나 수레를 사용해야하고 여전히 주어진 소수점 수로 강제 변환하여 문자열로 변환하는 경우 등은 (다소 서투른) 방법을 제공합니다.

>>> q = 1324343032.324325235 * 1000 / 1000
>>> a = "%.3f" % q
>>> a
'1324343032.324'
>>> b = float(a)
>>> b
1324343032.324

그래서:

float("%3.f" % q)

<답변7>

나는format기능은 나쁜 생각입니다. 아래를 참조하십시오. 값을 반올림합니다. 저는 Python 3.6을 사용합니다.

>>> '%.3f'%(1.9999999)
'2.000'

대신 정규식을 사용하십시오.

>>> re.match(r'\d+.\d{3}', str(1.999999)).group(0)
'1.999'

<답변8>

Almo의 링크 설명이런 일이 발생합니다. 문제를 해결하려면decimal library.


<답변9>

아마도 이렇게 :

def myTrunc(theNumber, theDigits):

    myDigits = 10 ** theDigits
    return (int(theNumber * myDigits) / myDigits)

<답변10>

좋아요, 이것은 숫자에 대해 문자열로 작업하고 간단한 조각을 수행하는이 문제를 해결하는 또 다른 방법입니다. 이것은 당신에게잘림반올림 대신 숫자의 출력.

num = str(1324343032.324325235)
i = num.index(".")
truncated = num[:i + 4]
    
print(truncated)

산출:

'1324343032.324'

물론 다음을 구문 분석 할 수 있습니다.

float(truncated)

<답변11>

Python 3 모듈이나 추가 수학적 연산을로드하지 않고이 문제를 해결할 방법을 찾은 후 str.format () e .float () 만 사용하여 문제를 해결했습니다. 이 방법은 대부분의 commom 솔루션에서와 같이 다른 수학적 연산을 사용하는 것보다 빠릅니다. 매우 큰 데이터 세트로 작업하기 때문에 빠른 솔루션이 필요했습니다.

def truncate_number(f_number, n_decimals):
      strFormNum = "{0:." + str(n_decimals+5) + "f}"
      trunc_num = float(strFormNum.format(f_number)[:-5])
      return(trunc_num)

# Testing the 'trunc_num()' function
test_num = 1150/252
[(idx, truncate_number(test_num, idx)) for idx in range(0, 20)]

다음 출력을 반환합니다.

[(0, 4.0),
 (1, 4.5),
 (2, 4.56),
 (3, 4.563),
 (4, 4.5634),
 (5, 4.56349),
 (6, 4.563492),
 (7, 4.563492),
 (8, 4.56349206),
 (9, 4.563492063),
 (10, 4.5634920634),
 (11, 4.56349206349),
 (12, 4.563492063492),
 (13, 4.563492063492),
 (14, 4.56349206349206),
 (15, 4.563492063492063),
 (16, 4.563492063492063),
 (17, 4.563492063492063),
 (18, 4.563492063492063),
 (19, 4.563492063492063)]

<답변12>

다음을 사용할 수도 있습니다.

import math

nValeur = format(float(input('Quelle valeur ?    ')), '.3f')

Python 3.6에서는 작동합니다.


<답변13>

a = 1.0123456789
dec = 3 # keep this many decimals
p = 10 # raise 10 to this power
a * 10 ** p // 10 ** (p - dec) / 10 ** dec
>>> 1.012

<답변14>

가장 좋고 적절한 방법은decimal기준 치수.

import decimal

a = 1324343032.324325235

decimal_val = decimal.Decimal(str(a)).quantize(
   decimal.Decimal('.001'), 
   rounding=decimal.ROUND_DOWN
)
float_val = float(decimal_val)

print(decimal_val)
>>>1324343032.324

print(float_val)
>>>1324343032.324

다른 값을 사용할 수 있습니다.rounding=decimal.ROUND_DOWN, 사용 가능한 옵션은 다음과 같습니다.ROUND_CEILING,ROUND_DOWN,ROUND_FLOOR,ROUND_HALF_DOWN,ROUND_HALF_EVEN,ROUND_HALF_UP,ROUND_UP, 및ROUND_05UP. 각 옵션에 대한 설명을 찾을 수 있습니다.here in docs.


<답변15>

이 질문 이후 파이썬이 변경되었을 수 있습니다. 아래의 모든 것이 잘 작동하는 것 같습니다.

Python2.7

int(1324343032.324325235 * 1000) / 1000.0
float(int(1324343032.324325235 * 1000)) / 1000
round(int(1324343032.324325235 * 1000) / 1000.0,3)
# result for all of the above is 1324343032.324

<답변16>

다음 해결책을 제안합니다.

def my_floor(num, precision):
   return f'{num:.{precision+1}f}'[:-1]

my_floor(1.026456,2) # 1.02


<답변17>

5에서 7 사이의 난수를 생성하고 소수점 3 자리로 제한하고 싶습니다.

import random

num = float('%.3f' % random.uniform(5, 7))
print (num)

<답변18>

def truncate(number: float, digits: int) -> float:
    pow10 = 10 ** digits
    return number * pow10 // 1 / pow10
f1 = 1.2666666
f2 = truncate(f1, 3)
print(f1, f2)
1.2666666 1.266

변화한다f1번호digits시간을 왼쪽으로 이동 한 다음 모든 소수를 잘라 내고 마지막으로 숫자를 뒤로 이동합니다.digits오른쪽으로 시간.

시퀀스의 예 :

1.2666666 # number
1266.6666 # number * pow10
1266.0    # number * pow10 // 1
1.266     # number * pow10 // 1 / pow10

<답변19>

좋은 솔루션을 개발하고 있습니다.If하지만 작동합니다! (<1 숫자에만 해당)

def truncate(number, digits) -> float:
    startCounting = False
    if number < 1:
      number_str = str('{:.20f}'.format(number))
      resp = ''
      count_digits = 0
      for i in range(0, len(number_str)):
        if number_str[i] != '0' and number_str[i] != '.' and number_str[i] != ',':
          startCounting = True
        if startCounting:
          count_digits = count_digits + 1
        resp = resp + number_str[i]
        if count_digits == digits:
            break
      return resp
    else:
      return number

<답변20>

>>> float(1324343032.324325235) * float(1000) / float(1000)

1324343032.3243253

>>> round(float(1324343032.324325235) * float(1000) / float(1000), 3)

1324343032.324
반응형