Một số số thập phân không thể được biểu diễn chính xác dưới dạng float nhị phân do biểu diễn bên trong của số float nhị phân. Ví dụ: làm tròn 14.225 đến hai chữ số thập phân không dẫn đến 14,23 như người ta có thể mong đợi nhưng trong 14,22.
Python :
In: round(14.225, 2)
Out: 14.22
Tuy nhiên, giả sử rằng chúng ta có biểu diễn chuỗi 14.225 là '14 .225 ', chúng ta sẽ có thể đạt được kết quả làm tròn mong muốn '14 .23' dưới dạng biểu diễn chuỗi.
Cách tiếp cận này có thể được khái quát đến độ chính xác tùy ý.
Giải pháp Python 2/3 có thể
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
Cách sử dụng :
# 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
Bài tập
Đối số đầu vào 1 : một chuỗi chứa
- ít nhất một chữ số (
0
,1
,2
,3
,4
,5
,6
,7
,8
,9
), - nhiều nhất một dấu thập phân (
.
) phải có trước ít nhất một chữ số, - một dấu trừ tùy chọn (
-
) làm ký tự đầu tiên.
Đối số đầu vào 2 : số nguyên không âm
Đầu ra : chuỗi được làm tròn chính xác (cơ sở 10)
làm tròn = Làm tròn một nửa từ số không
Đây là một mã golf . Số byte thấp nhất sẽ thắng!
round(A,B
5 byte
0
không phải là số nguyên dương, nó là "không âm".
123.4 & 5 --> 123.40000
? Hoặc chúng ta có thể giả sử đầu vào thứ hai sẽ không bao giờ lớn hơn số thập phân sau điểm trong đầu vào đầu tiên?