일부 십진수는 이진 부동 소수점의 내부 표현으로 인해 이진 부동 소수점으로 정확하게 표현 될 수 없습니다. 예를 들어 14.225를 소수점 이하 두 자리로 반올림하면 14.23이 아니라 14.22가됩니다.
파이썬 :
In: round(14.225, 2)
Out: 14.22
그러나 '14 .225 '로 14.225의 문자열 표현이 있다고 가정하면 원하는 반올림 '14 .23'을 문자열 표현으로 얻을 수 있어야합니다.
이 방법은 임의의 정밀도로 일반화 할 수 있습니다.
가능한 파이썬 2/3 솔루션
import sys
def round_string(string, precision):
assert(int(precision) >= 0)
float(string)
decimal_point = string.find('.')
if decimal_point == -1:
if precision == 0:
return string
return string + '.' + '0' * precision
all_decimals = string[decimal_point+1:]
nb_missing_decimals = precision - len(all_decimals)
if nb_missing_decimals >= 0:
if precision == 0:
return string[:decimal_point]
return string + '0' * nb_missing_decimals
if int(all_decimals[precision]) < 5:
if precision == 0:
return string[:decimal_point]
return string[:decimal_point+precision+1]
sign = '-' if string[0] == '-' else ''
integer_part = abs(int(string[:decimal_point]))
if precision == 0:
return sign + str(integer_part + 1)
decimals = str(int(all_decimals[:precision]) + 1)
nb_missing_decimals = precision - len(decimals)
if nb_missing_decimals >= 0:
return sign + str(integer_part) + '.' + '0' * nb_missing_decimals + decimals
return sign + str(integer_part + 1) + '.' + '0' * precision
사용법 :
# No IEEE 754 format rounding
In: round_string('14.225',2)
Out: '14.23'
# Trailing zeros
In: round_string('123.4',5)
Out: '123.40000'
In: round_string('99.9',0)
Out: '100'
# Negative values
In: round_string('-99.9',0)
Out: '-100'
In: round_string('1',0)
Out: '1'
# No unnecessary decimal point
In: round_string('1.',0)
Out: '1'
# No unnecessary decimal point
In: round_string('1.0',0)
Out: '1'
In: for i in range(8):
print(round_string('123456789.987654321',i))
Out: 123456790
123456790.0
123456789.99
123456789.988
123456789.9877
123456789.98765
123456789.987654
123456789.9876543
직무
입력 인수 1 : 포함하는 문자열
- 하나 이상의 자리 (
0
,1
,2
,3
,4
,5
,6
,7
,8
,9
) - 소수점 이하 자릿수 (
.
)는 하나 이상이어야하며 -
첫 문자 인 선택적인 빼기 ( ).
입력 인수 2 : 음이 아닌 정수
출력 : 올바르게 반올림 된 (기본 10) 문자열
반올림 = 반에서 0으로 반올림
이것은 code-golf 입니다. 가장 적은 바이트 수가 이깁니다!
round(A,B
5 바이트
0
양의 정수가 아니라 "음이 아닌"입니다.
123.4 & 5 --> 123.40000
있습니까? 아니면 두 번째 입력이 첫 번째 입력의 포인트 이후의 소수점 이하 자릿수보다 크지 않다고 가정 할 수 있습니까?