в любом случае
автору:
1. определение currency-map лучше вынести в функу в которой стоит обработать пару очевидных проблем: ответ не 200, в ответе не json, :Valute пустой или не валидный (тут уже на твое усмотрение, второе сложнее и дольше расписывать). Сам currency-map заполнять результатом работы этой функи что бы ошибки стреляли из единой точки входа в скрипт
2. хранить рейты в памяти перед отображением лучше в чем-то более точном чем float. ratio или decimal лучше подойдут.
3. округлять рейты только во время печати, никаких round фунок тебе не нужно.