Imprimir mais de uma casa decimal em RUBY

Estou aprendendo Ruby, e para treinar, uso a plataforma URI Online Judge para resolver alguns problemas apresentados, e para que seja corrigido o que eu faço, existem alguns requisitos dependendo do exercício, e um deles é, imprimir mais de uma casa decimal(limitado dependendo do exercício). Até ai OK, eu sei, usando: .round antes de imprimir um calor e colocando a quantidade de casas decimeis que eu quero imprimir.
Mas o problema vem quando o valor a ser impresso tem casas decimais 0.00 (mais de um zero) e ele acaba imprimindo apenas um zero apos o ponto.

exemplo:

func, nhoras, vhoras = gets.to_i, gets.to_i, gets.to_f puts "NUMBER = #{func}\n" puts "SALARY = U$ #{((nhoras * vhoras) + 0.001).round 2}\n"

Se entrarmos com os valores func = 25, nhoras = 100 e vhoras = 5.5, imprime: “NUMBER = 25” e “SALARY = U$ 550.0” e não “SALARY = U$ 550.00” como deveria / esperado.

Como podem ver, eu té somei o valor multiplicado por 0.001 para ver se imprimia dois zeros após o ponto, mas mesmo assim, imprimi apenas 1 o que acaba fazendo com que o exercício esteja errado (o modo de avaliação é comparando os resultados que o meu código produziu com uma tabela já feita deles).

1 curtida

O problema é que o round(2) vai pegar o resultado 550.001 e truncar todos os zeros à esquerda. Ao invés do round pode-se utilizar o sprintf para imprimir com precisão.

sprintf('%.2f', nhoras * vhoras)

// syntax sugar
'%.2f' % (nhoras * vhoras)

Acho que não é o caso do exercício, mas atenção que se fosse pra armazenar o valor como float, na hora de converter novamente iria perder a precisão. Devem existir algumas gems que lidam com precisão (teria que pesquisar), até o próprio Rails lida com isso. Mas no caso do teu exercício, acho que o sprintf é suficiente.