go-common/app/job/main/growup/service/tax.go

128 lines
2.1 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package service
const (
_range0_30 float64 = 0.0
_range30_50 float64 = 0.05
_range50_100 float64 = 0.10
_range100_150 float64 = 0.15
_range150_300 float64 = 0.20
_range300_500 float64 = 0.25
_range500_1000 float64 = 0.30
_range1000_2000 float64 = 0.40
_range2000_3000 float64 = 0.50
// _range3000_end float64 = 0.60
)
// TaxRate tax rate
type TaxRate struct {
start float64
end float64
rate float64
}
// Tax tax
func Tax(income float64) (tax float64) {
rs := rates(income)
for _, r := range rs {
if income >= r.end {
tax += Mul(float64(r.end-r.start), r.rate)
} else {
tax += Mul(float64(income-r.start), r.rate)
}
}
return
}
func rates(income float64) (rs []*TaxRate) {
if income > 0 {
r := &TaxRate{
start: 0,
end: 30,
rate: _range0_30,
}
rs = append(rs, r)
}
if income > 30 {
r := &TaxRate{
start: 30,
end: 50,
rate: _range30_50,
}
rs = append(rs, r)
}
if income > 50 {
r := &TaxRate{
start: 50,
end: 100,
rate: _range50_100,
}
rs = append(rs, r)
}
if income > 100 {
r := &TaxRate{
start: 100,
end: 150,
rate: _range100_150,
}
rs = append(rs, r)
}
if income > 150 {
r := &TaxRate{
start: 150,
end: 300,
rate: _range150_300,
}
rs = append(rs, r)
}
if income > 300 {
r := &TaxRate{
start: 300,
end: 500,
rate: _range300_500,
}
rs = append(rs, r)
}
if income > 500 {
r := &TaxRate{
start: 500,
end: 1000,
rate: _range500_1000,
}
rs = append(rs, r)
}
if income > 1000 {
r := &TaxRate{
start: 1000,
end: 2000,
rate: _range1000_2000,
}
rs = append(rs, r)
}
if income > 2000 {
r := &TaxRate{
start: 2000,
end: 3000,
rate: _range2000_3000,
}
rs = append(rs, r)
}
if income > 3000 {
r := &TaxRate{
start: 3000,
end: 1<<31 - 1,
rate: _range2000_3000,
}
rs = append(rs, r)
}
return
}
// FIXME
// func mul(x, y float64) (z float64) {
// f := new(big.Float)
// xb := big.NewFloat(x)
// yb := big.NewFloat(y)
// z, _ = f.Mul(xb, yb).Float64()
// return
// }