Как не терять центи при рассчете средств

Рейтинг: 0Ответов: 1Опубликовано: 17.02.2023

Я храню значение в базе как int64 и оперирую int64, а не float, перемножаю на 100 и округляю до ближайшего. Но насколько я понял, при расчете налогов когда идет перемножение/деление я теряю цент, а это мне не позволительно.

type Amount int

func NewFromFloat(f float64) Amount {
    return Amount (math.Round(f*100))
}

func (a Amount) Float() float64 {
    return float64(a) / 100
}

func (a Amount) Abs() Amount{
    if a < 0 {
        return -a
    }
    return a
}

func (a Amount) String() string {
    return strconv.FormatFloat(a.Float(), 'f', 2, 64)
}

func (a Amount) Tax(percent float64) Amount {
    return a+ ((a*NewFromFloat(percent))/100)/100
}

Как вариант решения проблемы, я предполагаю использовать пакет https://pkg.go.dev/github.com/shopspring/decimal для работы с десятичными числами, но опять же, возникает вопрос не попадутся ли такие случаи как выше, не будет ли теряться цент на расчетах налогов

Ответы

▲ 0

Вы сами ответили на свой вопрос, для оперирования денежными единицами, используйте пакет с типом decimal. В рамках пакета есть богатый функционал, для этого типа. Встроенные числовые типы go не в коем случае не стоит использовать, для решения этой проблемы.