Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package com.cedarsoft.business.calc.roi;
  
  import  org.jetbrains.annotations.NotNull;
 
 import java.util.List;

Calculates the PAngV 2000.
 
 public class PAngV2000Calculator {
   @NotNull
   public static final Money TARGET_DELTA = new Money( 0.005 );
   public static final double INITIAL_RATE_GUESS = 0.5;
   public static final double MIN_CHANGE = 0.000004;

  
The payments
 
   private final List<Paymentpayments = new ArrayList<Payment>();

  
The base date for the calculation
 
   @NotNull
   private final LocalDate baseDate;

  
Creates a new pang calculator for the given base date

Parameters:
baseDate the base date
 
   public PAngV2000Calculator( @NotNull LocalDate baseDate ) {
     this. = baseDate;
   }

  
Adds a (default) payment.

Parameters:
amount the amount
date the date
 
   public void addPayment( @NotNull Money amount, @NotNull LocalDate date ) {
     addPaymentnew DefaultPaymentamountdate ) );
   }

  
Adds a payment

Parameters:
payment the payment
 
   public void addPayment( @NotNull Payment payment ) {
     .addpayment );
   }

  
Adds the given payments

Parameters:
additionalPayments the payments
 
   public void addPayments( @NotNull Collection<? extends PaymentadditionalPayments ) {
     this..addAlladditionalPayments );
   }

  
Returns the amount of the payments

Returns:
the amount of payments
 
   @NotNull
   public Money getPaymentsAmount() {
     MutableMoney amount = new MutableMoney();
     for ( Payment payment :  ) {
       amount.pluspayment.getAmount() );
     }
     return amount.getMoney();
   }

  
Returns the payments

Returns:
 
   @NotNull
   public List<? extends PaymentgetPayments() {
     return Collections.unmodifiableList );
   }

  
Calculates the PangV

Returns:
the PangV
  @NotNull
  public PangV calculate() {
    if ( .size() < 2 ) {
      return .;
    }
    MutableMoney sum = new MutableMoney();
    for ( Payment payment :  ) {
      sum.pluspayment.getAmount() );
    }
    boolean sumPositive = sum.getEstimatedValue() > 0;
    //test it using bisection
    double actualGuess;
    if ( sumPositive ) {
      actualGuess = -;
    } else {
      actualGuess = ;
    }
    int counter = 0;
    Money actualValue = .;
    while ( actualValue.abs().isGreaterThan ) ) {
      double change =  / Math.pow( 2, counter );
      if ( change <  ) {
        return new PangVactualGuessactualValuecountersum.immutable() );
      }
      //modify guess
      if ( !sumPositive ^ actualValue.isGreaterThan. ) ) {
        actualGuess += change;
      } else {
        actualGuess -= change;
      }
      actualValue = calculateCashValueactualGuess );
      counter++;
    }
    return new PangVactualGuessactualValuecountersum.immutable() );
  }

  
Calculates the cash value for all payments

Parameters:
rate the rate
Returns:
the cash value for all payments
  @NotNull
  public Money calculateCashValuedouble rate ) {
    MutableMoney cashValue = new MutableMoney();
    for ( Payment payment :  ) {
      cashValue.pluscalulateCashValuepaymentrate ) );
    }
    return cashValue.immutable();
  }

  
Calculates the cash value of a payment for a given rate. The base for this calculation is a year with 365 days

Parameters:
payment
rate the rate
Returns:
the value
  @NotNull
  public static Money calulateCashValue( @NotNull LocalDate base, @NotNull Payment paymentdouble rate ) {
    double years = ..calculateYearsbasepayment.getDate() );
    double divider = Math.pow( 1 + rateyears );
    return payment.getAmount().dividedivider );
  }
New to GrepCode? Check out our FAQ X