У меня есть числовое значение, например 30,6355, которое представляет деньги, как округлить до 2 десятичных знаков? - PullRequest
4 голосов
/ 09 ноября 2010

У меня есть числовое значение, например 30,6355, которое представляет деньги, как округлить до 2 десятичных знаков?

Ответы [ 3 ]

20 голосов
/ 09 ноября 2010

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

При работе с деньгами используйте фиксированный десятичный тип.В Ruby (и Java) используйте BigDecimal.

13 голосов
/ 09 ноября 2010

Ruby 1.8:

class Numeric
    def round_to( places )
        power = 10.0**places
        (self * power).round / power
    end
end

(30.6355).round_to(2)

Ruby 1.9:

(30.6355).round(2)

В 1.9, округлять можно округлить до указанного числа цифр.

0 голосов
/ 07 апреля 2016

Это округлит для некоторых полезных случаев - не очень хорошо написано, но это работает! Не стесняйтесь редактировать.

def round(numberString)
numberString = numberString.to_s
decimalLocation = numberString.index(".")
numbersAfterDecimal = numberString.slice(decimalLocation+1,numberString.length-1)
numbersBeforeAndIncludingDeciaml = numberString.slice(0,decimalLocation+1)

if numbersAfterDecimal.length <= 2
    return numberString.to_f
end

thingArray = numberString.split("")
thingArray.pop

prior = numbersAfterDecimal[-1].to_i
idx = numbersAfterDecimal.length-2

thingArray.reverse_each do |numStr|
    if prior >= 5
        numbersAfterDecimal[idx] = (numStr.to_i + 1).to_s unless (idx == 1 && numStr.to_i == 9)
        prior = (numStr.to_i + 1)
    else
        prior = numStr.to_i
    end
    break if (idx == 1)
    idx -= 1
end

resp = numbersBeforeAndIncludingDeciaml + numbersAfterDecimal[0..1]
resp.to_f
end

round(18.00) == 18.0

round(18.99) == 18.99

round(17.9555555555) == 17.96

round(17.944444444445) == 17.95

round(15.545) == 15.55

round(15.55) == 15.55

round(15.555) == 15.56

round(1.18) == 1.18

round(1.189) == 1.19

...