2010-10-12 4 views
7

Я пытаюсь преобразовать температуру от Фаренгейта в градусы Цельсия:«неверное число аргументов» ArgumentError при использовании круглого

puts 'Convertir grados Fahrenheit a Celcius' 
STDOUT.flush 
x = gets.chomp 

aprox = (x * 100.0).round(2)/100.0 

resultado = (aprox-32)/1.8 

puts resultado 

я использую правильную формулу для преобразования Фаренгейта в градусах Цельсия:

Celsius = Fahrenheit - 32/1.8

Однако, когда я запускаю это в консоли, это дает мне следующую ошибку:

`round': wrong number of arguments (1 for 0) (ArgumentError)

Я пробовал различать но я не понимаю, почему это не работает.

+0

возможного контратип http://stackoverflow.com/questions/2748911/error-in-rounding-off-values- use-round-in-ruby – rogerdpack

ответ

11

В рубиновой версии до 1.9.0 round не принимаются аргументы. Она округляется до ближайшего целого числа (см documentation about floats and the use of round)

Используйте вместо этого:

aprox = (x * 100).round()/100.0 

Весь смысл умножения и деления на 100 округлить последние две цифры х.

+5

Вы должны разделить на 100.0 в конце. В противном случае вы выполняете целочисленное деление и просто теряете последние две цифры. – sepp2k

+0

О, большое спасибо! Я хочу дать вам голос, но я не могу, извините. – Ivanhercaz

+0

sepp2k Спасибо, что указали это. Я исправил код. Я также добавил точность, основанную на ответе Грега. –

5

Вы не указали, какую версию Ruby вы используете. Это имеет значение, потому что в Rubies до 1.9 Float # round не принимал параметр. В 1.9+ он делает.

 
>> RUBY_VERSION #=> "1.9.2" 
>> pi = 3.141 #=> 3.141 
>> pi.round #=> 3 
>> pi.round(1) #=> 3.1 
>> 3.141.round(1) #=> 3.1 
+0

Спасибо за информацию, я не знаю этого и это интересно. – Ivanhercaz

2

ActiveSupport (часть рельсов) также дает Float # раунда (точность)

+0

Обратите внимание, что activesupport может использоваться вне рельсов. Это может быть даже полезно для не-веб-рубиновых приложений. –

Смежные вопросы