programing

부동 소수점 번호를 특정 정밀도로 변환한 다음 문자열로 복사

minimums 2023. 6. 7. 22:25
반응형

부동 소수점 번호를 특정 정밀도로 변환한 다음 문자열로 복사

부동소수점 번호가 있어요.135.12345678910해당 값을 문자열로 연결하고 싶지만, 원하는 것은135.123456789인쇄를 사용하면 다음과 같은 작업을 쉽게 수행할 수 있습니다.

print "%.9f" % numvar

와 함께numvar제 원래 번호입니다.이것을 하는 쉬운 방법이 있습니까?

Python < 3 (예: 2.6 [댓글 보기] 또는 2.7)에서는 두 가지 방법이 있습니다.

# Option one
older_method_string = "%.9f" % numvar

# Option two
newer_method_string = "{:.9f}".format(numvar)

그러나 3 이상의 Python 버전(예: 3.2 또는 3.3)의 경우 옵션 2가 선호됩니다.

옵션 2에 대한 자세한 내용은 Python 설명서의 문자열 형식에 대한 링크를 제안합니다.

옵션 1에 대한 자세한 내용은 이 링크로 충분하며 다양한 플래그에 대한 정보가 있습니다.

파이썬 3.6(2016년 12월 공식 출시), 추가f문자열 리터럴, 여기에서 더 많은 정보를 확인하십시오. 이 정보는 다음을 확장합니다.str.format방법(컬리 브레이스를 사용하여 다음과 같이.f"{numvar:.9f}"원래의 문제를 해결함), 즉,

# Option 3 (versions 3.6 and higher)
newest_method_string = f"{numvar:.9f}"

문제를 해결합니다.자세한 내용은 @Or-Duan의 답변을 확인하십시오. 하지만 이 방법은 빠릅니다.

파이썬 3.6

확실히 하기 위해, 당신은 f-string 포맷을 사용할 수 있습니다.이 구문은 다음과 거의 같습니다.format방법, 하지만 조금 더 좋게 해주세요.

예:

print(f'{numvar:.9f}')

새 f 문자열에 대한 자세한 내용:

다음은 다양한 테스트 방법의 실행 시간 다이어그램입니다(위의 마지막 링크 참조).

실행 시간

사용.round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'

런타임이 될 때까지 정밀도를 알 수 없는 경우 다음과 같은 다른 형식 지정 옵션이 유용합니다.

>>> n = 9
>>> '%.*f' % (n, numvar)
'135.123456789'

포맷을 하는 것은 인쇄가 아니라 문자열의 속성이므로 그냥 사용할 수 있습니다.

newstring = "%.9f" % numvar

9자리로 정밀도를 설정하려면 다음을 얻습니다.

print "%.9f" % numvar

두 자리의 정밀도를 반환합니다.

print "%.2f" % numvar 

2자리 숫자와 부동 변환된 값으로 정밀도 반환:

numvar = 4.2345
print float("%.2f" % numvar) 

소수점 수가 범위 내에 있는 한 작동하며, 이후에는 하드웨어에 따라 다릅니다.소수점 14위 이상에서는 일치하지 않았습니다.디지털 고도 파일의 위도 값

https://docs.python.org/3/tutorial/floatingpoint.html

lat1 = -81.0016666666670072 
lat2 = -81.0016666666670062
assert lat1 == lat2 # no asserion error :(

# try with Decimal
from decimal import *
getcontext().prec = 16
assert Decimal(lat1) == Decimal(lat2) # no asserion error :(

# Lets see string representation
print(f"{lat1:.16f}", f"{lat2:.16f}")
# -81.0016666666670062 -81.0016666666670062 :( Perils of Float

# Lets see how it is store in hardware
print(lat1.hex(), lat2.hex())
# -0x1.4401b4e81b500p+6 -0x1.4401b4e81b500p+6

# 14-th position it is able to identify 
lat1 = -81.0016666666670162 
lat2 = -81.0016666666670062
#-0x1.4401b4e81b501p+6 -0x1.4401b4e81b500p+6
print(lat1.hex(), lat2.hex())
assert lat1 == lat2 # assertion error :)

str함수에 버그가 있습니다.다음을 시도하십시오.'0,196553'이 표시되지만 올바른 출력은 '0,196554'입니다.왜냐하면.str함수의 기본값은 ROUND_HALF_UP입니다.

>>> value=0.196553500000 
>>> str("%f" % value).replace(".", ",")

언급URL : https://stackoverflow.com/questions/15263597/convert-floating-point-number-to-a-certain-precision-and-then-copy-to-string

반응형