Hvor can I en python do the following rounding:
Round to the nearest 05 decimal
7,97 -> 7,95
6,72 -> 6,70
31,06 -> 31,05
36,04 -> 36,
I faced the same problem and as I didn't find the ultimate solution to this, here's mine.
Firs of all the main part(which was answered before):
def round_to_precision(x, precision):
# This correction required due to float errors and aims to avoid cases like:
# 100.00501 / 0.00001 = 10000500.999999998
# It has a downside as well - it may lead to vanishing the difference for case like
# price = 100.5 - (correction - correction/10), precision = 1 => 101 not 100
# 5 decimals below desired precision looks safe enough to ignore
correction = 1e-5 if x > 0 else -1e-5
result = round(x / precision + correction) * precision
return round(result, find_first_meaningful_decimal(precision))
The only tricky part here was that find_first_meaningful_decimal, which I've implemented like this:
def find_first_meaningful_decimal(x):
candidate = 0
MAX_DECIMAL = 10
EPSILON = 1 / 10 ** MAX_DECIMAL
while round(x, candidate) < EPSILON:
candidate +=1
if candidate > MAX_DECIMAL:
raise Exception('Number is too small: {}'.format(x))
if int(x * 10 ** (candidate + 1)) == 5:
candidate += 1
return candidate
print(round_to_precision(129.950002, 0.0005))
print(round_to_precision(-129.95005, 0.0001))
129.9505
-129.9501
There we go.
round(VALUE*2.0, 1) / 2.0
regards
An extension of the accepted answer.
def round_to(n, precision):
correction = precision if n >= 0 else -precision
return round(int(n/precision+correction)*precision, len(str(precision).split('.')[1]))
test_cases = [101.001, 101.002, 101.003, 101.004, 101.005, 101.006, 101.007, 101.008, 101.009]
[round_to(-x, 0.003) for x in test_cases]
[-101.001, -101.001, -101.001, -101.004, -101.004, -101.004, -101.007, -101.007, -101.007]
def round05(number):
return (round(number * 20) / 20)
Or more generically:
def round_to_value(number,roundto):
return (round(number / roundto) * roundto)
The only problem is because you're using floats you won't get exactly the answers you want:
>>> round_to_value(36.04,0.05)
36.050000000000004
Here's a one liner
def roundto(number, multiple):
return number+multiple/2 - ((number+multiple/2) % multiple)
def round_to(n, precision):
correction = 0.5 if n >= 0 else -0.5
return int( n/precision+correction ) * precision
def round_to_05(n):
return round_to(n, 0.05)