I have numbers that I want to go from:
1.215145156155 => 1.2
1.368161685161 => 1.35
1.578414616868 => 1.6
(*Note: the hundredths place should not be marked if it is zero.)
What's the fastest way to do this?
This is what I have right now, and it is not fast enough:
def rounder(v):
v = str(round(float(v),2))
if len(v) == 3: v = v + str(0)
d0 = int(v[0])#ones
d1 = int(v[2])#tenths
d2 = int(v[3])#hundredths
if d2 <= 4:
return str(d0)+'.'+str(d1)
elif 4 < d2 < 7:
return str(d0)+'.'+str(d1)+str(5)
elif d2 >= 7:
if d1 != 9:
return str(d0)+'.'+str(d1+1)
if d1 == 9:
return str(d0+1)+'.'+str(0)
Use your number line, number from 1-10 and jump from 9 back to 5 and from 9 forward to 10. They can see that you have to jump 4 times to get to 5 but only once to get to 10. 9 rounded of to the nearest 5 is then equal to 10.
"To five places" means "to five decimal places". First, I count out the five decimal places, and then I look at the sixth place: 3.14159 | 265... I've drawn a little line separating the fifth place from the sixth place. This can be a handy way of "keeping your place", especially if you are dealing with lots of digits.
Scale, round, unscale.
round(20*v)/20
I should warn you that the behaviour might surprise you:
>>> round(20*1.368161685161)/20
1.3500000000000001
The rounding is working correctly, but IEEE numbers can't represent 1.35 exactly. Python 2.7 is smarter about this and will choose the simplest representation, 1.35
, when printing the number. The actual stored value is identical in 2.7 and earlier versions.
I would try
round(v * 2, 1) / 2
Should be pretty fast. The other suggested variant
round(v * 20) / 20
seems to be even slightly faster:
$ python -mtimeit "round(1.368161685161 * 2, 1) / 2"
1000000 loops, best of 3: 0.291 usec per loop
$ python -mtimeit "round(1.368161685161 * 20) / 20"
1000000 loops, best of 3: 0.248 usec per loop
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With