Does anyone know how to round a number to nearest .0125? For example there's a number 167.1131 then it needs to be converted to 167.1125. I have tried to do it with round
but it rounds to 0.x.
Asked
Active
Viewed 904 times
2

Michael
- 109
- 1
- 1
- 13
-
Possible duplicate of [Round up to Third decimal Place in Python](https://stackoverflow.com/questions/9232256/round-up-to-third-decimal-place-in-python) – quamrana Feb 06 '18 at 08:54
-
1What is the end purpose of the rounding up? This issue, perhaps can be addressed elsewhere along the line? – Sazzy Feb 06 '18 at 09:06
3 Answers
9
Convert it to "0.0125's", round THAT, and convert back:
round(x/0.0125)*0.0125

Scott Hunter
- 48,888
- 12
- 60
- 101
-
-
@quamrana: Well, if x=5, the above yields 5, while switching the '*' and '`' (which is what I assume "other way round" means) yields 0. So, no? – Scott Hunter Feb 06 '18 at 12:25
-
Ok, my bad. I usually mistake true for false in `if` statements. This time its mistaking `/0.0125` for `/80`! I would do it like this: `round(x*80)/80` – quamrana Feb 06 '18 at 12:32
-
@quamrana: Or there's also `0.125 * round(x*8.0, 1)`, which should be correctly rounded (in case that matters, and assuming that overflow and underflow are avoided in the multiplications). – Mark Dickinson Feb 06 '18 at 12:54
2
The round()
function is focused on rounding to tenths, hundredths, thousandths and so on - essentially rounding to some negative exponent of 10.
So, as 0.0125 is not such a number that the round()
can handle, you can
- either apply a multiplication to your input number before giving it to
round
, so that it can do a rounding for which it is designed, and afterwards you correct for the initial multiplication. One of the other answers does it like this. - or you can, if you think the first approach looks complicated, solve the problem with pure mathematics. The code below essentially looks how much there is actually "too much" above a multiple of 0.0125. This "too much" amount is a remainder (modulus) of a division. This division is done on integers, so there is an initial multiplication and correction afterwards, just like in the first approach.
Code for the second approach:
def round_0125(number):
mult_number = number * 10000
remainder = mult_number % 125
return (mult_number - remainder) / 10000
round_0125(167.1131)
#167.1125
round_0125(167.5738)
#167.5625

Sander Vanden Hautte
- 2,138
- 3
- 22
- 36
0
value = 167.1125
dec_value = value % 1 # get decimal part
whole_value = value // 1
my_range = np.arange(0, 1, 0.0125)
distance = np.abs(dec_value - my_range) # get the absolute distance
index = np.argmin(distance) # find the index of smallest distance
result = whole_value + my_range[index]

hamster ham
- 729
- 8
- 8