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


256

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

9 / 5  #=> 1

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


4
실제로이 값을 반환하기 위해 메서드를 사용하는 경우 변수에 값을 할당 할 필요가 없습니다. 단순히 def method; a - b/8; end메소드 호출의 마지막 식 리턴 값이기 때문에, 상기 방법으로 계산 된 결과를 리턴한다.
Phrogz

답변:


268

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

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

10
이것은 작동하지만 아래의 to_f 답변이 더 유용합니다. Ruby에서 to_f가 더 관용적입니까?
notapatch

9
.to_f당신은 예를 들어, 정수를 포함하는 두 개의 변수를 분할하는 경우 대답은 더 낫다 a.to_f / b. 문자 그대로 두 개의 하드 코딩 된 정수 (아마도 이상 할 수 있음)를 나누는 경우 사용하는 9.0 / 5것이 좋습니다.
jefflunt

350

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

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

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


1
이것은 허용 된 답변보다 더 많은 "레일"답변입니다.
Sean Ryan

@ muistooshort : 그것을 복제 할 수 없습니다, 죄송합니다. 아마 뭔가 잘못하고 있었을 것입니다.
Joao Costa

4
@SeanRyan 왜 루비가 아닌 레일스를 사용 하는가? (Ruby on) Rails 개발자가 왜 일반적인 루비 개발자와 다른 방식으로이 특정한 일을하는지 모르겠습니다. 아마도 나는 의미론을 nitpicking하고 있으며 대부분의 사람들은 이와 같은 경우 Rails와 Ruby를 동의어로 간주합니다.
Chinoto Vokro

169

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

9.fdiv(5)  #=> 1.8

1
이것은 내가 테스트 한 가장 빠른 방법이며 더 많은 성능을 얻는 유일한 방법은 부동 소수점 인 피연산자를 나누는 것입니다. 구문을 배우기 위해 Ruby에 소수 생성기를 만들었습니다. 이제 가장 적합한 것을 배우도록 최적화하고 있습니다. 여기에 내가 함께 넣어 벤치 마크는 다음과 같습니다 '베이스 64'을 요구, 필요 'ZLIB를'; 풋 Zlib.inflate (Base64.decode64 ( "eJxlkMEOwiAQRO98hekFuGzxQEwPXvwR01ZqiYHqBk2Tln8XDlWgnDbM25nJonq9NaoD7ZTtR9PigxK09zM7AkgRHieXTYHOsBNf1nklM6B6TuhYpdp + rPgSdiCOi / D / kQ71QBOtAVFLEDly05 + UYQ2H + MckL6z0zioDdJG1S9K1K4iQAW66DhnmiqRYKEJFXMByux + XuOJ2XdO60dKsjC7aBtyTL5O5hLk ="))
Chinoto Vokro

하나의 질문은, 우리가 '소수'를 사용하는 것처럼 정밀도를 보존 할 것입니까?
Adam Aiken

39

irb로 확인할 수 있습니다 :

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

26

루비 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.


1
mathn 모듈은 루비 2.2부터 사용되지 않습니다
Meier


6

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 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.