tax.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package income
  2. const (
  3. _range0_30 float64 = 0.0
  4. _range30_50 float64 = 0.05
  5. _range50_100 float64 = 0.10
  6. _range100_150 float64 = 0.15
  7. _range150_300 float64 = 0.20
  8. _range300_500 float64 = 0.25
  9. _range500_1000 float64 = 0.30
  10. _range1000_2000 float64 = 0.40
  11. _range2000_3000 float64 = 0.50
  12. _range3000max float64 = 0.60
  13. )
  14. // TaxRate tax rate
  15. type TaxRate struct {
  16. start float64
  17. end float64
  18. rate float64
  19. }
  20. // Tax tax
  21. func Tax(income float64) (tax float64) {
  22. rs := rates(income)
  23. for _, r := range rs {
  24. if income >= r.end {
  25. tax += Mul(float64(r.end-r.start), r.rate)
  26. } else {
  27. tax += Mul(float64(income-r.start), r.rate)
  28. }
  29. }
  30. return
  31. }
  32. func rates(income float64) (rs []*TaxRate) {
  33. if income > 0 {
  34. r := &TaxRate{
  35. start: 0,
  36. end: 30,
  37. rate: _range0_30,
  38. }
  39. rs = append(rs, r)
  40. }
  41. if income > 30 {
  42. r := &TaxRate{
  43. start: 30,
  44. end: 50,
  45. rate: _range30_50,
  46. }
  47. rs = append(rs, r)
  48. }
  49. if income > 50 {
  50. r := &TaxRate{
  51. start: 50,
  52. end: 100,
  53. rate: _range50_100,
  54. }
  55. rs = append(rs, r)
  56. }
  57. if income > 100 {
  58. r := &TaxRate{
  59. start: 100,
  60. end: 150,
  61. rate: _range100_150,
  62. }
  63. rs = append(rs, r)
  64. }
  65. if income > 150 {
  66. r := &TaxRate{
  67. start: 150,
  68. end: 300,
  69. rate: _range150_300,
  70. }
  71. rs = append(rs, r)
  72. }
  73. if income > 300 {
  74. r := &TaxRate{
  75. start: 300,
  76. end: 500,
  77. rate: _range300_500,
  78. }
  79. rs = append(rs, r)
  80. }
  81. if income > 500 {
  82. r := &TaxRate{
  83. start: 500,
  84. end: 1000,
  85. rate: _range500_1000,
  86. }
  87. rs = append(rs, r)
  88. }
  89. if income > 1000 {
  90. r := &TaxRate{
  91. start: 1000,
  92. end: 2000,
  93. rate: _range1000_2000,
  94. }
  95. rs = append(rs, r)
  96. }
  97. if income > 2000 {
  98. r := &TaxRate{
  99. start: 2000,
  100. end: 3000,
  101. rate: _range2000_3000,
  102. }
  103. rs = append(rs, r)
  104. }
  105. if income > 3000 {
  106. r := &TaxRate{
  107. start: 3000,
  108. end: 1<<31 - 1,
  109. rate: _range3000max,
  110. }
  111. rs = append(rs, r)
  112. }
  113. return
  114. }