2013-09-10 1 views
2

일부 데이터를 처리하는 레일 앱이 있는데이 데이터 중 일부는 1.9943과 같은 소수점 이하 숫자와이 숫자와 다른 정수 사이의 구분을 포함합니다. 나는 이것을 저장하는 가장 좋은 방법이 무엇인지 알고 싶었다.수레, 소수 또는 정수

정수를 정수로 유지할 수있는 숫자를 십진수로 소수점 이하 자릿수로 저장할 생각입니다. 이

#<BigDecimal:7fda470aa9f0,'0.197757E1',18(18)> 

같은 이상한 형식으로했지만 내가 두 진수 또는 정수와 소수를 나눌 때 올바른 연산을 수행 할 것으로 보인다. 정수로 정수를 나눌 때 제대로 작동하지 않습니다. 레일즈가 결과를 자동으로 적절한 십진수로 변환 할 것이라고 생각했지만, 정수로 유지하고 나머지를 제거하는 것으로 보입니다. 이것에 대해 제가 할 수있는 일이 있습니까?

그리고 이러한 유형의 정보를 저장하는 가장 좋은 방법은 무엇입니까? 십진수로 모두 저장해야합니까? 아니면 수레로 둡니다. 당신은 정밀도를 잃지 않고 두 정수를 나눌 경우

답변

3

, 당신은 Float 또는 BigDecimal 처음에 그들 중 하나를 캐스팅해야합니다

irb(main):007:0> 2/3 
=> 0 
irb(main):008:0> Float(2)/3 
=> 0.666666666666667 

을 당신이 다른 결과 때를 얻을 말할 때 나는 조금 혼란 스러워요 Float/Integer 대 Integer/Float을 나눕니다. 동일한 결과를 가져야합니다.

irb(main):010:0> Integer(2)/Float(3) 
=> 0.666666666666667 
irb(main):011:0> Float(2)/Integer(3) 
=> 0.666666666666667 
irb(main):012:0> String(BigDecimal('2')/3) 
=> "0.666666666666666666666666666666666666666666666666666667E0" 
irb(main):013:0> String(2/BigDecimal('3')) 
=> "0.666666666666666666666666666666666666666666666666666667E0" 

코드 예제를 제공 할 수 있습니까?

저장 공간에 관한 한 모든 정수 데이터는 나중에 계산할 때 예상되는 용도에 관계없이 Integer으로 저장해야합니다.

플로트 대 BigDecimal의 저장은 필요한 정밀도에 따라 다릅니다. 정밀도가 많이 필요하지 않은 경우 Float은 배정 밀도 표현을 제공합니다. 높은 정밀도가 필요한 경우 BigDecimal은 임의 정밀도 표현을 제공합니다.

관련 :Ruby Numbers이 - 정수의 차이를 설명, 수레는 BigDecimal를하고, 유리수

+0

죄송합니다 내가 실수를했다. 정수/소수는 잘 동작한다. – user2158382

+0

이것은 float 대신 BigDecimal을 사용하는 것을 제외하면 작동한다. 왜 내가 대신 float을 사용해야하는지 말해 줄 수 있습니까? – user2158382

+0

@ user2158382 BigDecimal은 임의로 정확한 표현이 필요할 때 사용됩니다. Float는 배정도 표현으로 충분할 때 사용됩니다. – dbyrne