2012-01-15 4 views
0

변수를 float로 초기화 한 다음 times 루프에서 변수에 추가하려고합니다. 여기 내 코드는 다음과 같습니다프리미티브를 초기화하고 어떻게 추가합니까?

amt = 0.0 

5.times do 
    amt = amt + ("%.2f" % (item.price * 0.05)) 
end 

다음은 오류입니다 :

String can't be coerced into Float 

이 편집 :

나는 1.times do을 변경했습니다. 더 읽기 쉽도록 코드를 수정했습니다. 1.times은 실제 코드가 아닙니다.

+0

그것은 아마 (item.price * 0.05)에 의해 : 인 BigDecimal을 사용하려면

은, 당신이 원하는 것은,

그런 다음 application.rb에 '의 BigDecimal을'필요 "% .2f", 당신은 무엇을하려고합니까? –

+0

나는 일종의 sprintf 스타일을 추측하고 있습니다. –

+1

'1x do'? 뭐? – Linuxios

답변

1

첫째, 돈을 위해 float를 사용하지 마십시오.이 경우 BigInfo에서 사용하는 BigDecimal은 부동 소수점 연산이 정확하지 않습니다. 이 모드를 시도하기 때문에

amt = BigDecimal.new("0") 

1.times do 
    price = BigDecimal.new(item.price.to_s) 
    factor = BigDecimal.new("0.05") 
    amt += (price * factor).round(2) 
end 

amt 
+2

또는 모든 것을 센트로 처리하고 100으로 나누어 달러 금액을받습니다. –

+0

감사합니다. 나는 BigDecimal에 대해 몰랐다. – varatis

0

네, 모두 죄송합니다. 나는 Ruby에 익숙하지 않아서 이것이 문제라는 것을 알지 못했지만 "% .2f"가 문제를 일으켰습니다. (이 질문과는 관계가 없지만, 이것이하는 것은 양을 십진수 정밀도로 변환하는 것입니다.) 어리석은 실수!

+1

하지만 그냥 추가하지 않으시겠습니까? 아무 것도 변환 할 이유가 없습니다. 그리고 무언가에서 남은 1 배는 무엇입니까? 좀 이상해. –

+0

@DaveNewton 문제 설명을 단순화하려고했습니다. 실제 루프에는 좀 더 복잡한 레일스 구문이 있습니다. 루비 지식이있는 사람들이 대답 할 수 있도록 간단하게 만들고 싶었습니다. – varatis

+0

흠, 나는 질문을 실제로 포함하지 않았기 때문에 루프를 모두 빠져 나갔을 수도 있습니다. :) 그러나 "십진수 두 자리 정밀도"로 변환하지 않고 문자열로 변환하고 일부러 수행합니다. 도중에 서식을 지정하면 문제가 발생합니다. –

관련 문제