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)
?
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