128 lines
2.1 KiB
Go
128 lines
2.1 KiB
Go
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
|
|
// }
|