Por que "(1 * 2) * (1 / 2)" dá um valor em Python e outro em Ruby?

Por que a fórmula (1 * 2) * (1 / 2) em Python dá 1 e em Ruby dá 0? Tentei também (1 * 2).to_f * (1 / 2).to_f e o problema é o mesmo.

E (1 * 2) * (1 / (2).to_f)?

1 curtida

Dá diferença porque cada linguagem interpreta 1 / 2 de uma forma.

Em Python, o resultado da divisão é um float - ou seja, 0.5:

print(1 / 2) # 0.5

Em Ruby, o resultado é truncado/arredondado para um inteiro (e portanto é zero):

puts 1 / 2 # 0

E não adianta fazer (1 / 2).to_f, pois você só estará fazendo 0.to_f, que também será zero.

Ou seja, (1 * 2) (que é 2) é multiplicado pelo resultado de 1 / 2. Como em Python 1 / 2 é 0.5, então o resultado é igual a 1. Em Ruby, como 1 / 2 é zero, qualquer coisa multiplicado por isso dará zero.

A solução é fazer a divisão convertendo algum dos valores para float:

puts 1.to_f / 2 # 0.5

Pois assim eu forço um dos números para float, e o resultado da divisão não é mais arredondado. E aí a conta dá 1:

puts (1 * 2) * (1.to_f / 2) # 1.0

Outra opção é usar fdiv:

puts (1 * 2) * 1.fdiv(2) # 1.0

Por fim, fica a dica de sempre ler a documentação de cada linguagem (ver aqui e aqui), pois cada uma possui suas próprias regras e o que funciona para uma não necessariamente funcionará exatamente igual em outra :slight_smile:

4 curtidas