कुछ दशमलव संख्याओं को बाइनरी फ़्लोट्स के आंतरिक प्रतिनिधित्व के कारण बाइनरी फ़्लोट्स के रूप में ठीक से प्रस्तुत नहीं किया जा सकता है। उदाहरण के लिए: 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
), - अधिकतम एक दशमलव बिंदु पर (
.
) जिसे कम से कम एक अंक से पहले होना चाहिए, - एक वैकल्पिक ऋण (
-
) पहले चरित्र के रूप में।
इनपुट तर्क २ : एक गैर-नकारात्मक पूर्णांक
उत्पादन : सही ढंग से गोल (बेस 10) स्ट्रिंग
गोलाई = शून्य से आधा दूर
यह एक कोड-गोल्फ है । बाइट्स की सबसे कम संख्या जीतती है!
round(A,B
5 बाइट्स
0
एक सकारात्मक पूर्णांक नहीं है, यह "गैर-नकारात्मक" है।
123.4 & 5 --> 123.40000
? या क्या हम यह मान सकते हैं कि पहले इनपुट में बिंदु के बाद दूसरा इनपुट कभी भी दशमलव की मात्रा से बड़ा नहीं होगा?