[ruby] Ruby에서 나누기가 십진수 값 대신 정수를 반환하는 이유는 무엇입니까?

예를 들면 다음과 같습니다.

9 / 5  #=> 1

그러나 나는 기대했다 1.8. 올바른 10 진수 (정수가 아닌) 결과를 얻으려면 어떻게해야합니까? 왜 1전혀 돌아 오지 않습니까?



답변

정수 나누기를하고 있습니다. 다음 Float을 추가 하여 숫자 중 하나를 만들 수 있습니다 .0.

9.0 / 5  #=> 1.8
9 / 5.0  #=> 1.8


답변

정수 나누기를하고 있습니다. to_f물건을 부동 소수점 모드로 강제 하는 데 사용할 수 있습니다 .

9.to_f / 5  #=> 1.8
9 / 5.to_f  #=> 1.8

값이 리터럴 대신 변수 인 경우에도 작동합니다. 하나의 값을 부동 소수점으로 변환하면 전체 표현식을 부동 소수점 산술로 강제 변환하기에 충분합니다.


답변

Numeric#fdiv대신 사용할 수 있는 방법 도 있습니다.

9.fdiv(5)  #=> 1.8


답변

irb로 확인할 수 있습니다 :

$ irb
>> 2 / 3
=> 0
>> 2.to_f / 3
=> 0.666666666666667
>> 2 / 3.to_f
=> 0.666666666666667


답변

루비 mathn모듈을 포함시킬 수 있습니다 .

require 'mathn'

이런 식으로 분할을 정상적으로 만들 수 있습니다.

1/2              #=> (1/2)
(1/2) ** 3       #=> (1/8)
1/3*3            #=> 1
Math.sin(1/2)    #=> 0.479425538604203

이런 식으로 합리적으로 표현할 수없는 연산을 적용하기로 결정할 때까지 (예 : Rational) 정확한 나눗셈을 얻습니다 Math.sin.


답변

변화 5에를 5.0. 정수 나누기를 얻습니다.


답변

Fixnum # to_r은 여기에 언급되지 않았으며 루비 1.9부터 도입되었습니다. Fixnum을 합리적인 형식으로 변환합니다. 아래는 그 사용 예입니다. 또한 사용 된 모든 숫자가 Fixnum 인 경우 정확한 나눗셈을 제공 할 수 있습니다.

 a = 1.to_r  #=> (1/1) 
 a = 10.to_r #=> (10/1) 
 a = a / 3   #=> (10/3) 
 a = a * 3   #=> (10/1) 
 a.to_f      #=> 10.0

합리적인 수로 플로트를 조작 한 결과가 플로트에 적용되는 예입니다.

a = 5.to_r   #=> (5/1) 
a = a * 5.0  #=> 25.0