package Ġcom . github . ch ristop h pick l . der ba uer . model . amount Ċ Ċ interface ĠAmount Ro under Ġ{ ĊĠĠĠ Ġfun Ġround ( type : ĠAmount Type , Ġreal : ĠLong ): ĠLong Ċ } Ċ Ċ object ĠAmount Ro under Impl Ġ: ĠAmount Ro under Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġround ( type : ĠAmount Type , Ġreal : ĠLong ): ĠLong Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠAmount Type . Single ) Ġreal ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrest Ġ= Ġreal Ġ% Ġtype . th ous ands ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Rounded Ġ= Ġreal Ġ- Ġrest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddition Ġ= Ġcompute Round Addition ( type , Ġreal , Ġrest , Ġraw Rounded ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Rounded Ġ+ Ġ( addition Ġ* Ġ( if Ġ( real Ġ< Ġ 0 ) Ġ- 1 Ġelse Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Round Addition ( type : ĠAmount Type , Ġreal : ĠLong , Ġrest : ĠLong , Ġraw Rounded : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġabs Real Cut Ġ= ĠMath . abs ( raw Rounded Ġ/ Ġtype . th ous ands ) ĊĠĠĠĠĠĠĠ Ġval Ġabs Rest Ġ= ĠMath . abs ( rest ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabs Real Cut Ġ< Ġ 1 0 Ġ-> Ġcompute Round 2 Add itions ( type , Ġreal , Ġrest , Ġabs Rest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabs Real Cut Ġ< Ġ 1 0 0 Ġ-> Ġcompute Round 1 Add itions ( type , Ġabs Rest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Round 2 Add itions ( type : ĠAmount Type , Ġreal : ĠLong , Ġrest : ĠLong , Ġabs Rest : ĠLong ): ĠLong Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( rest Ġ== Ġ 0 L ) Ġ 0 Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabs Rest . toString (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Math . abs ( real ). toString (). elementAt ( 1 ) Ġ== Ġ' 0 ') Ġ" 0 $ it " Ġelse Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. substring ( 0 , Ġ 2 ). to Long () Ġ* Ġ 1 0 Ġ* Ġtype . th ous ands For Next ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Round 1 Add itions ( type : ĠAmount Type , Ġabs Rest : ĠLong ): ĠLong Ġ= ĊĠĠĠĠĠĠĠ Ġabs Rest . toString (). substring ( 0 , Ġ 1 ). toInt () Ġ* Ġ 1 0 0 Ġ* Ġtype . th ous ands For Next Ċ Ċ } Ċ