2015-04-24 3 views
0

У меня есть номера округления при расчете налога.Номера рубинового круга и расчет налога на оплату

, например, на сумму 2.12 и налога 20%, рассчитать его, как следует:

# this is on Numeric class 
def ceil_money 
    (self * 100).ceil/100.0 
end 

... 
amount = "2.12" 
((Float(amount.to_f) * Float("20.0"))/100).ceil_money 

результат 0.43.

К paypal Я должен отправить как налоговую ставку, так и сумму налога, и, похоже, он игнорирует мою сумму налога и рассчитывает налоговую стоимость на основе ставки налога. Но проблема, с которой я сталкиваюсь, заключается в том, что в сообщении подтверждения платежа я получаю tax_amount, поскольку 0.42 кажется, что они округляют это до нуля.

Я хочу знать, что такое правильная процедура для расчета налога, округление (ceil), округление (пол).

Любые другие предложения по этой теме?

+0

Скорее всего, это просто округление, но вам нужно будет дважды проверить с помощью PayPal. 20% от 2.12 составляет 0,424, что будет округлено до 0,42. – Drenmi

+0

'Float (amount.to_f)' - возможно, умножить на 1.0, чтобы действительно убедиться, что это Float :) – steenslag

+0

Пожалуйста, не используйте 'Float' для этого: вы пытаетесь сделать десятичный раунд в двоичном приближении к десятичное число. Это делает направление округления для граничных случаев существенно непредсказуемым, и похоже, что вам нужно предсказуемое решение. Вместо этого используйте десятичный тип с фиксированной точкой или с плавающей точкой или с целочисленной арифметикой. –

ответ

0

Я хотел бы использовать рубин встроенный в BigDecimal, чтобы получить более точное округление:

require 'big_decimal' 

amount = BigDecimal.new('2.12') 
tax_rate = 0.2 

(amount * tax_rate).round(2).to_f #=> 0.42 

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

amount = 2.12 
tax_rate = 0.2 

(amount * tax_rate).round(2) #=> 0.42