public class PersonTax
{
   private decimal _CalAmount = 0.00;
   private static decimal _DeductBase = 1100;
   private decimal _CalBase = 0.00;
   private decimal _TaxRate = 0.00;
   private decimal _TaxDeduct = 0.00;
   private decimal _Tax = 0.00;
   private Tax_Amount_Rate_Deduct[] arr_Tax_Amount_Rate_Deduct = null;
   private int _RateCount = 0;
   private decimal _MaxTaxRate = 0.45;
   private decimal _MaxTaxDeduct = 15375;
   
   pubic decimal CalAmount
   {
     get
     {
       return _CalAmount;
     }
     set
     {
        if (_CalAmount != value)
        {
           _CalAmount = value;
           Calculate();
        }
     }
   }
   public static decimal DeductBase
   {
       get
       {
          return _DeductBase;
       }
       set
       {
          if (_DeductBase != value)
          {
              _DeductBase = value;
              CalCulate();
          }
       }
   }
   public PersonTax
   {
      _CalAmount = 0.00;
      Calculate();  
   }
   public PersonTax(decimal nCalAmount,decimal nDeductBase)
   {
     _CalAmount = nCalAmount;
     _DeductBase = nDeductBase;
     Calculate();
   }
   public PersonTax(decimal nCalAmount)
   {
     _CalAmount = nCalAmount;
     Calculate(); 
   }
   public void Calculate()
   {
     _CalBase = _CalAmount - _DeductBase; 
     if (_RateCount == 0  || _CalAmount <= _DeductBase)
      {
         _TaxRate = 0.00;
         _TaxDeduct = 0.00;
         _Tax = 0.00;
         return;
      }
      if ( _CalBase > arr_Tax_Amount_Rate_Deduct[i]._Amount[_RateCount-1]._Amount)
      {
           _TaxRate = _MaxTaxRate;
           _TaxDeduct = _MaxTaxDeduct;
           _Tax = Round(_CalBase * _TaxRate,2) - _TaxDeduct;
           return;
      }
      for (int i=0; i<_RateCount; i++)
      {
 if (_CalBase <= arr_Tax_Amount_Rate_Deduct[i]._Amount)
         {
             _TaxRate = arr_Tax_Amount_Rate_Deduct[i]._Rate;
             _TaxDeduct = arr_Tax_Amount_Rate_Deduct[i]._Deduct;
             _Tax = Round(_CalBase * _TaxRate,2) - _TaxDeduct;
             return;     
         }       
      }
   }
   public void PushRate(decimal nAmount,decimal nRate,decimal nDeduct)
   {
     if (_RateCount == 0)
     {
        _RateCount ++;
     arr_Tax_Amount_Rate_Deduct = new Tax_Amount_Rate_Deduct[_RateCount];
        arr_Tax_Amount_Rate_Deduct[0] = new Tax_Amount_Rate_Deduct(nAmount,nRate,nDeduct);   
     }
     else
     {
        _RateCount ++;
        bool lFind = false;
        int nCnt = 0;
        Tax_Amount_Rate_Deduct[] temp_Tax_Amount_Rate_Deduct = new Tax_Amount_Rate_Deduct[_RateCount];
        for (int i=0; i<_RateCount; i++)
        {
           if (nAmount = arr_Tax_Amount_Rate_Deduct[i]._Amount)
           {
              arr_Tax_Amount_Rate_Deduct[i].SetData(nAmount,nRate,nDeduct);
              _RateCount--;
              return;
           }
           else if(lFind == false && nAmount < arr_Tax_Amount_Rate_Deduct[i]._Amount)
           {
              temp_Tax_Amount_Rate_Deduct[++nCnt] = new Tax_Amount_Rate_Deduct(nAmount,nRate,nDeduct);
              lFind = true;
           }
           else if(lFind == false)
           {
              if (i < _RateCount - 1)
              {
               temp_Tax_Amount_Rate_Deduct[++nCnt] = arr_Tax_Amount_Rate_Deduct[i];
              }
              else
              {
temp_Tax_Amount_Rate_Deduct[++nCnt] = new Tax_Amount_Rate_Deduct(nAmount,nRate,nDeduct);
              }
           }
           else if(lFind == true)
           {
              temp_Tax_Amount_Rate_Deduct[++nCnt] = arr_Tax_Amount_Rate_Deduct[i-1]
           }
        }
        arr_Tax_Amount_Rate_Deduct = temp_Tax_Amount_Rate_Deduct;
     }
   }
   public void PopRate(decimal nAmount)
   {
      if(_RateCount == 0)
      {
         return;
      }
      bool lFind = false;
      _RateCount--;
      int nCnt = 0;
      Tax_Amount_Rate_Deduct[] temp_Tax_Amount_Rate_Deduct = new Tax_Amount_Rate_Deduct[_RateCount];
      for (int i=0; i<_RateCount+1; i++)
      {
         if (lFind == false && nAmount = arr_Tax_Amount_Rate_Deduct[i]._Amount)
         {
            lFind == true;  
         }
         else if (lFind == false)
         {
            if (i < _RateCount)
            {
             temp_Tax_Amount_Rate_Deduct[++nCnt] = arr_Tax_Amount_Rate_Deduct[i];
            }
         }
         else if (lFind == true)
         {
            temp_Tax_Amount_Rate_Deduct[++nCnt] = arr_Tax_Amount_Rate_Deduct[i-1];            
         }
      }
      if (lFind == false)
      {
         _RateCount ++;
         return;
      }
        arr_Tax_Amount_Rate_Deduct = temp_Tax_Amount_Rate_Deduct;      
   }
}
public class Tax_Amount_Rate_Deduct
{
   public decimal _Amount = 0.00;
   public decimal _Rate = 0.00;
   public decimal _Deduct = 0.00;
   
   public Tax_Amount_Rate_Deduct()
   {
      SetData(0.00,0.00,0.00);
   }
   public Tax_Amount_Rate_Deduct(decimal nAmount,decimal nRate,decimal nDeduct)
   {
      SetData(nAmount,nRate,nDeduct);
   }
   public void SetData(decimal nAmount,decimal nRate,decimal nDeduct)  
   {
      _Amount = nAmount;
      _Rate = nRate;
      _Deduct = nDeduct;
   }
   public void CopyDate(Tax_Amount_Rate_Deduct oTemp)
   {
      SetDate(oTemp._Amount,oTemp._Rate,oTemp._Deduct);
   }
}

解决方案 »

  1.   

    这个类是在NODEPAD中临时写的,没有测试过,有些因为懒,就没有写全,不过基本上应该都写出来了,请楼上测试一下,有的地方改一下,有的地方完善一下,应该没有问题
      

  2.   

    还有开始还是运行N个PUSHRATE函数,因为懒,所以没有把它们PUSH进去
      

  3.   

    很明显的错误,不过,只要思路对就行了,我没有改啊,你自已改吧,只是在NODEPAD中下午花了几分钟时间粗粗的设计了一下
      

  4.   

    CALCULATE 计算个人所得税,如果扣除后金额大于最后一个税额,则用最大的税率和最大速算扣除数,
    PUSHRATE 增加一个税率,如果税额相同,则不增加,直接修改相应的税率和速算扣除数,按税额大于排序,
    POPRATE 删除一个税率,如果找到指定的税额,则予以删除,否则不变,还是按税额大于排序
      

  5.   

    楼上,呵呵<提问>按钮就行了