ตัวเลขทศนิยมบางตัวไม่สามารถแสดงอย่างแม่นยำว่าเป็นเลขฐานสองแบบลอยตัวเนื่องจากเป็นตัวแทนภายในของเลขฐานสองแบบลอยตัว ตัวอย่างเช่น: การปัดเศษ 14.225 ถึงสองหลักทศนิยมไม่ได้ส่งผลให้เกิด 14.23 เนื่องจากอาจมีหนึ่งใน 14.22
งูหลาม :
In: round(14.225, 2)
Out: 14.22
อย่างไรก็ตามสมมติว่าเรามีการแทนค่าสตริงของ 14.225 เป็น '14 .225 'เราควรจะสามารถบรรลุการปัดเศษ '14 .23' ที่ต้องการในการแทนค่าสตริงได้
วิธีการนี้สามารถกำหนดให้เป็นความแม่นยำโดยพลการ
Python 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) อย่างถูกต้อง
การปัดเศษ = ปัดครึ่งห่างจากศูนย์
round(A,B
5 bytes
0
ไม่ใช่จำนวนเต็มบวกมันคือ "ไม่เป็นเชิงลบ"
123.4 & 5 --> 123.40000
หรือไม่? หรือเราสามารถสมมติว่าอินพุตที่สองจะไม่ใหญ่กว่าจำนวนทศนิยมหลังจากที่จุดในอินพุตแรก?