2013-05-15 2 views
1

как в C и C++как инициализировать переменную типа «двойной» в рубине

double x 

Как сделать это в Ruby?

Или быть в виде поплавка?

Я хочу запустить

x=5/2 

затем

x=2.5 

вместо

x=2 
+1

Я думаю, что ответы, которые вы» re lokking for находятся в этом посте: http://stackoverflow.com/questions/5502761/why-is-division-in-ruby-returning-an-integer-floating-point-arithmetic –

+0

@Bartdude Я не настолько скучен для ответьте на повторяющийся вопрос. Я не могу это найти ! F – linzilan

+0

Когда вы пишете '5/2' в C++, он будет по-прежнему' 2'. Ничего не изменилось. – Hauleth

ответ

6

Если один операнды с плавающей точкой, результатом будет плавать тоже.

5/2.0 # => 2.5 
3

В рубин, вы создаете поплавок, указав десятичную точку:

2 #=> integer 
2.0 #=> float 

Если разделить целое число на другое целое число, вы получите целое число. Вы должны использовать поплавок в разделе:

5/2 #=> 2 
5.0/2 #=> 2.5 
5/2.0 #=> 2.5 
2

Рубин динамически типизированных, так что это не явный способ привести переменную к определенному типу. Например:

a = "a" # here a is a String 
a = 5 # now a is a Fixnum 
a = 5.0 # now a is a Float 

полностью действителен.

Так что происходит, когда вы говорите 5/2? Ruby ищет оператор / в первом операнде, в этом случае целое число, а затем вызывает функцию со вторым операндом, а также целое число. Таким образом, Ruby предполагает, что вам требуется целочисленное деление.

Решение состоит в том, чтобы сделать один из операторов с плавающей точкой, это может быть сделано, по крайней мере, двумя способами:

5/2,0

или

5/2.to_f

1

Переменные не имеют типов в Ruby, только объекты. (И понятие «тип» скрыто, оно не проявляется в программе. «Тип» объекта - это протокол, который он говорит, то есть сообщения, на которые он отвечает, и ответы на эти сообщения. В частности, тип объекта является не его класса.)

+0

Тип - это класс с методами, так почему вы перефразируете простую и понятную концепцию «класса» через теорию массового обслуживания? Я думаю, что ваш ответ - только вербальный салат. – nurettin

+0

@nurettin: Два объекта, которые говорят по одному протоколу, имеют один и тот же тип * независимо от того, имеют ли они один и тот же класс. Это * основное * свойство объектной ориентации. Это единственное свойство, которое отличает его от других форм абстракции, например. Абстрактные типы данных. Без этого свойства нет никакой разницы между объектно-ориентированной абстракцией данных и ADT. В Ruby нет никакого способа говорить об этом типе, нет понятия протокола или типа в Ruby. В Java или C# существует 'интерфейс', который пытается захватить протокол, но обычно терпит неудачу. –

+0

Я не согласен с первым предложением в вашем ответе. Но какой интерфейс вы набираете? 2 и 5 имеют одинаковый класс. Понятие класса не обязательно должно существовать во время компиляции или наследовать какой-то «интерфейсный протокол, согласованный обеими сторонами», чтобы поговорить о нем. '5.is_a? Fixnum' и все. Я думаю, что вы имеете смысл, а затем уходите по тангенсу, пытаясь написать объединяющую теорию. – nurettin

0

по умолчанию рубина всех поплавки двойные согласно исходного коду

чтобы создать значение с плавающей точкой, вы должны добавить .0 в отличие от целых чисел стоимость.

Примечание: если вы используете два целых числа в одной операции по умолчанию результатом является целое число

5.0 # float 
5 # integer 
5/2 = 2 # integer 
5/2.0 = 2.5 #float 

определение поплавка на исходном рубин код

enter image description here

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