Поскольку решения, использующие строковые операции, кажутся в порядке, вот хороший короткий вариант:
def nearest( x, Max9 = 2 ):
s = str(x).replace('.','')
splitter = Max9 * '9'
sOut = s.split( splitter )[0]
return int( sOut ) + 1
a = 7.999999985666533
b = 1.5999999991220535
c = 1.2799999997163347
print nearest( a )
print nearest( b )
print nearest( c )
, просто обеспечивающий:
>> 8
>> 16
>> 128
Редактировать
Как правильно указал @ gc7__, вышеупомянутое решение игнорирует случаи немного больших значений.Это делает код немного более сложным, но все еще в порядке.
import re
def nearest( x, Max09 = 2, digits=25 ):
s = ('{val:.{dig}f}'.format( dig=digits, val=x ) ).split('.')
rnd = 0
if len(s) < 2 or s[1] == '0':## input is integer xyz or float of type xyz.
out = int( x )
else:
s0, s9 = Max09*'0', Max09*'9'
splitter = '{}|{}'.format( s0, s9)
body = s[0]
p0, p9 = s[1].find(s0), s[1].find(s9) ### returns -1 if nothing is found
tail = re.split( splitter, s[1] )[0]
out = int( body + tail )
if p9 > -1 and ( p9 < p0 or p0 < 0 ):
rnd = 1
return out + rnd
a = 7.999998560066533
b = 1.5999999991220535
c = 1.2799999997163347
d = 1233
e = 19935
f = 1.6000000000123
g = 10006.6000000000123
h = 500001.0
print nearest( a )
print nearest( b )
print nearest( c )
print nearest( d )
print nearest( e )
print nearest( f )
print nearest( g )
print nearest( h )
, обеспечивающий:
>> 8
>> 16
>> 128
>> 1233
>> 19935
>> 16
>> 100066
>> 500001