Как сделать алгоритм «умным» автоматически - PullRequest
1 голос
/ 22 мая 2019

Я бы хотел округлить число в коде, но таким образом, чтобы оно адаптировалось к каждому значению.

Например, я бы хотел, чтобы алгоритм округления возвращал:

  • 0,999999 должно возвращаться 1
  • 0.0749999 должно вернуть 0.075
  • 0,006599 должно вернуть 0,0066 и так далее ...

Я не знаю заранее количество цифр (что является моей проблемой)

Я думал использовать строки, чтобы найти, где находятся 9 (или считать 0), но это довольно много усилий для того, о чем я думал?

Если вы знаете какой-либо способ сделать это (если возможно, без расширенных библиотек), я был бы признателен.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 мая 2019

Это сложно.но, это работает.Пожалуйста, убедитесь, что результат - то, что вы хотите.Я думаю, вы можете понять, как округлить число из кода.

def clear9(numstr):
    liststr = list(numstr)
    for index in range(len(liststr)-1,-1,-1):
        if liststr[index] == '.': continue
        if liststr[index] == '9': 
            liststr[index] = '0'
            if index == 0:
                liststr.insert(0, '1')
        else: 
            if index != len(liststr)-1:
                liststr[index] = str(int(liststr[index])+1)
            break
    numstr = ''
    for item in liststr:
        numstr += item
    return numstr

def myround(num):
    numstr = str(num)
    numstr = clear9(numstr)
    return float(numstr)


print (myround(9.05))
print (myround(9.999999))
print (myround(0.999999))
print (myround(0.0749999))
print (myround(0.006599))
print (myround(0.00659923))
print (myround(0.09659923))
print (myround(-0.00659923))
9.05
10.0
1.0
0.075
0.0066
0.00659923
0.09659923
-0.00659923
0 голосов
/ 23 мая 2019

Работать с числами с плавающей запятой сложно. Вы хотите выполнить некоторое округление в базе 10, но числа с плавающей запятой - в базе 2.

Поэтому я предлагаю использовать модуль decimal, который может точно представлять действительные числа, а не с плавающей точкой base-2 .:

from decimal import Decimal

def myround(num):
    dec = Decimal(num)
    adj = abs(dec.adjusted())+1
    return round(num, adj)

Посмотрите документацию для Decimal.adjusted(), чтобы понять, как это работает.

Тест:

In [1]: from decimal import Decimal                                                                      

In [2]: def myround(num): 
   ...:     dec = Decimal(num) 
   ...:     adj = abs(dec.adjusted())+1 
   ...:     return round(num, adj) 
   ...:                                                                                                  

In [3]: myround(0.999999)                                                                                
Out[3]: 1.0

In [4]: myround(0.006599)                                                                                
Out[4]: 0.0066

In [5]: myround(0.0749999)                                                                               
Out[5]: 0.075
0 голосов
/ 23 мая 2019
import math

def round_(number):
    dist = int(math.log10(abs(number))) #number of zeros after decimal point
    return (round(number, abs(dist) + 2) if dist != 0 else round(number))

print(round_(0.999999))
print(round_(0.0749999))
print(round_(0.006599))
print(round_(-0.00043565))

выход:

1
0.075
0.0066
-0.00044
...