[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lmi-commits] [lmi] master dcbe9418 14/27: Change currency fields in led
From: |
Greg Chicares |
Subject: |
[lmi-commits] [lmi] master dcbe9418 14/27: Change currency fields in ledger to integral cents |
Date: |
Mon, 25 Apr 2022 12:56:15 -0400 (EDT) |
branch: master
commit dcbe94185cb77d44b7600b69f1393a98eea7201f
Author: Gregory W. Chicares <gchicares@sbcglobal.net>
Commit: Gregory W. Chicares <gchicares@sbcglobal.net>
Change currency fields in ledger to integral cents
The underlying data were already integral numbers of cents. Representing
them as decimal dollars in the ledger object introduced roundoff error.
Example from '.test' file for first cell in 'sample' census:
- 1056399.02000000001863
+ 105639902
- 1129424.70999999996275
+ 112942471
Before these changes, this command:
git grep 'ariantValues().*=.*dblize'
found 59 matches; now it finds none.
This matters for several reasons. An immediate practical benefit is that
system-test output is easier to compare, e.g.:
d i f f i c u l t easy
1886.50999999999999091 --> 188651
2034.63000000000010914 --> 203463
2193.38999999999987267 --> 219339
Incidentally, it uses less space:
$du -bc /opt/lmi/test/*.test |grep 'total$'
115816293 total
$du -bc /opt/lmi/touchstone/*.test |grep 'total$'
139046450 total
Aesthetically, it was simply ugly to turn an exact integer like 188651
(cents) into an inexact decimal like 1886.50999999999999091 dollars;
worse, 32- and 64-bit builds often emitted different inexact values.
And the next commit will demonstrate a performance benefit.
---
accountvalue.cpp | 22 ++---
custom_io_0.cpp | 16 ++--
custom_io_1.cpp | 18 ++---
group_quote_pdf_gen_wx.cpp | 12 +--
ihs_acctval.cpp | 82 +++++++++----------
ihs_avmly.cpp | 24 +++---
ihs_avsolve.cpp | 12 ++-
ledger.cpp | 2 +-
ledger_evaluator.cpp | 106 +++++++++++++------------
ledger_invariant_init.cpp | 16 ++--
ledger_text_formats.cpp | 194 ++++++++++++++++++++++-----------------------
main_cli.cpp | 6 +-
solve.cpp | 6 +-
13 files changed, 263 insertions(+), 253 deletions(-)
diff --git a/accountvalue.cpp b/accountvalue.cpp
index 7a3118de..69f043de 100644
--- a/accountvalue.cpp
+++ b/accountvalue.cpp
@@ -130,7 +130,7 @@ AccountValue::AccountValue(Input const& input)
currency AccountValue::base_specamt(int year) const
{
// CURRENCY !! Cents in ledger will make rounding unnecessary.
- return round_specamt().c(InvariantValues().SpecAmt[year]);
+ return round_specamt().c(InvariantValues().SpecAmt[year] / 100.0);
}
//============================================================================
@@ -339,16 +339,16 @@ void AccountValue::DoYear
}
}
- VariantValues().AcctVal[Year] = dblize(AVUnloaned + AVRegLn + AVPrfLn);
+ VariantValues().AcctVal[Year] = centize(AVUnloaned + AVRegLn + AVPrfLn);
VariantValues().CSVNet[Year] = VariantValues().AcctVal[Year] -
VariantValues().SurrChg[Year];
// Update death benefit: "deathbft" currently holds benefit as of the
// beginning of month 12, but we want it as of the end of that month,
// in case the corridor or option 2 drove it up during the last month.
TxSetDeathBft();
- VariantValues().EOYDeathBft[Year] = dblize(deathbft);
+ VariantValues().EOYDeathBft[Year] = centize(deathbft);
// IHS !! Change one of these names, which differ only in the terminal 's'.
- InvariantValues().GrossPmt[Year] +=
dblize(std::accumulate(GrossPmts.begin(), GrossPmts.end(), C0));
+ InvariantValues().GrossPmt[Year] +=
centize(std::accumulate(GrossPmts.begin(), GrossPmts.end(), C0));
InvariantValues().Outlay[Year] =
InvariantValues().GrossPmt [Year]
- InvariantValues().NetWD [Year]
@@ -489,7 +489,7 @@ void AccountValue::PerformSpecAmtStrategy()
for(int j = 0; j < BasicValues::GetLength(); ++j)
{
- InvariantValues().SpecAmt[j] = dblize(SA);
+ InvariantValues().SpecAmt[j] = centize(SA);
}
}
@@ -550,7 +550,7 @@ void AccountValue::TxOptionChange()
// Carry the new spec amt forward into all future years.
for(int j = Year; j < BasicValues::GetLength(); ++j)
{
- InvariantValues().SpecAmt[j] = dblize(ActualSpecAmt);
+ InvariantValues().SpecAmt[j] = centize(ActualSpecAmt);
}
}
@@ -582,7 +582,7 @@ void AccountValue::TxSpecAmtChange()
// Carry the new spec amt forward into all future years.
for(int j = Year; j < BasicValues::GetLength(); ++j)
{
- InvariantValues().SpecAmt[j] = dblize(ActualSpecAmt);
+ InvariantValues().SpecAmt[j] = centize(ActualSpecAmt);
}
}
@@ -727,7 +727,7 @@ void AccountValue::TxLoanRepay()
AVUnloaned -= RequestedLoan;
AVRegLn += RequestedLoan; // IHS !! Preferred loans--see lmi.
- InvariantValues().NewCashLoan[Year] = dblize(RequestedLoan);
+ InvariantValues().NewCashLoan[Year] = centize(RequestedLoan);
}
/// Set account value before monthly deductions.
@@ -927,7 +927,7 @@ void AccountValue::TxTakeWD()
// Carry the new spec amt forward into all future years.
for(int j = Year; j < BasicValues::GetLength(); ++j)
{
- InvariantValues().SpecAmt[j] = dblize(ActualSpecAmt);
+ InvariantValues().SpecAmt[j] = centize(ActualSpecAmt);
}
}
break;
@@ -946,7 +946,7 @@ void AccountValue::TxTakeWD()
wd -= std::min(WDFee, round_withdrawal().c(wd * WDFeeRate));
// IHS !! This treats input WD as gross; it probably should be net. But
compare lmi.
- InvariantValues().NetWD[Year] = dblize(wd);
+ InvariantValues().NetWD[Year] = centize(wd);
// IHS !! TaxBasis -= wd; // Withdrawals are subtracted from basis in lmi.
}
@@ -996,7 +996,7 @@ void AccountValue::TxTakeLoan()
AVUnloaned -= RequestedLoan;
AVRegLn += RequestedLoan; // IHS !! Also preferred loans: implemented
in lmi.
- InvariantValues().NewCashLoan[Year] = dblize(RequestedLoan);
+ InvariantValues().NewCashLoan[Year] = centize(RequestedLoan);
}
/// Test for lapse.
diff --git a/custom_io_0.cpp b/custom_io_0.cpp
index 35192899..ca901a84 100644
--- a/custom_io_0.cpp
+++ b/custom_io_0.cpp
@@ -523,18 +523,18 @@ void custom_io_0_write(Ledger const& ledger_values,
std::string const& filename)
{
os
<< std::setprecision(0)
- << Curr_.AcctVal [j]
- << ',' << Curr_.CSVNet [j]
- << ',' << Curr_.EOYDeathBft [j]
- << ',' << Curr_.NetIntCredited [j]
- << ',' << Curr_.COICharge [j]
+ << Curr_.AcctVal [j] / 100.0
+ << ',' << Curr_.CSVNet [j] / 100.0
+ << ',' << Curr_.EOYDeathBft [j] / 100.0
+ << ',' << Curr_.NetIntCredited [j] / 100.0
+ << ',' << Curr_.COICharge [j] / 100.0
// Column headers suggest that 'Load' should precede 'MinPrem',
// but this order was accepted; perhaps both were always zero
// in actual practice.
<< ',' << 0 // 'MinPrem' always
zero.
- << ',' << prem_load [j]
- << ',' << surr_chg [j]
- << ',' << Invar.GrossPmt [j]
+ << ',' << prem_load [j] / 100.0
+ << ',' << surr_chg [j] / 100.0
+ << ',' << Invar.GrossPmt [j] / 100.0
<< ',' << Curr_.AnnGAIntRate [j] * 10000.0 // 'IntRate' in bp.
<< '\n'
;
diff --git a/custom_io_1.cpp b/custom_io_1.cpp
index 8ee6a3aa..9206026d 100644
--- a/custom_io_1.cpp
+++ b/custom_io_1.cpp
@@ -393,19 +393,19 @@ void custom_io_1_write(Ledger const& ledger_values,
std::string const& filename)
{
os
<< std::setprecision(2)
- << Curr_.AcctVal [j]
- << ',' << Curr_.CSVNet [j]
- << ',' << Curr_.EOYDeathBft [j]
+ << Curr_.AcctVal [j] / 100.0
+ << ',' << Curr_.CSVNet [j] / 100.0
+ << ',' << Curr_.EOYDeathBft [j] / 100.0
<< std::setprecision(4)
<< ',' << Curr_.AnnGAIntRate [j] * 10000.0 // 'IntRate' in bp.
<< std::setprecision(2)
- << ',' << Curr_.NetIntCredited [j]
- << ',' << Curr_.COICharge [j]
- << ',' << Curr_.SpecAmtLoad [j] // 'MiscFees' = spec
amt load.
- << ',' << prem_load [j]
+ << ',' << Curr_.NetIntCredited [j] / 100.0
+ << ',' << Curr_.COICharge [j] / 100.0
+ << ',' << Curr_.SpecAmtLoad [j] / 100.0 // 'MiscFees' = spec
amt load.
+ << ',' << prem_load [j] / 100.0
<< ',' << 0 // 'MinPrem' always
zero.
- << ',' << surr_chg [j]
- << ',' << Invar.GrossPmt [j]
+ << ',' << surr_chg [j] / 100.0
+ << ',' << Invar.GrossPmt [j] / 100.0
<< '\n'
;
}
diff --git a/group_quote_pdf_gen_wx.cpp b/group_quote_pdf_gen_wx.cpp
index ddc32445..b45db350 100644
--- a/group_quote_pdf_gen_wx.cpp
+++ b/group_quote_pdf_gen_wx.cpp
@@ -543,7 +543,7 @@ void group_quote_pdf_generator_wx::add_ledger(Ledger const&
ledger)
break;
case e_col_basic_face_amount:
{
- double const z = invar.SpecAmt.at(year);
+ double const z = invar.SpecAmt.at(year) / 100.0;
rd.output_values[i] = '$' + ledger_format(z, f0);
if(is_composite)
{
@@ -553,7 +553,7 @@ void group_quote_pdf_generator_wx::add_ledger(Ledger const&
ledger)
break;
case e_col_basic_premium:
{
- double const z = invar.ErModalMinimumPremium.at(year);
+ double const z = invar.ErModalMinimumPremium.at(year) / 100.0;
rd.output_values[i] = '$' + ledger_format(z, f2);
if(is_composite)
{
@@ -563,7 +563,7 @@ void group_quote_pdf_generator_wx::add_ledger(Ledger const&
ledger)
break;
case e_col_supplemental_face_amount:
{
- double const z = invar.TermSpecAmt.at(year);
+ double const z = invar.TermSpecAmt.at(year) / 100.0;
rd.output_values[i] = '$' + ledger_format(z, f0);
if(is_composite)
{
@@ -573,7 +573,7 @@ void group_quote_pdf_generator_wx::add_ledger(Ledger const&
ledger)
break;
case e_col_additional_premium:
{
- double const z = invar.EeModalMinimumPremium.at(year);
+ double const z = invar.EeModalMinimumPremium.at(year) / 100.0;
rd.output_values[i] = '$' + ledger_format(z, f2);
if(is_composite)
{
@@ -583,7 +583,7 @@ void group_quote_pdf_generator_wx::add_ledger(Ledger const&
ledger)
break;
case e_col_total_face_amount:
{
- double const z = invar.SpecAmt.at(year) +
invar.TermSpecAmt.at(year);
+ double const z = (invar.SpecAmt.at(year) +
invar.TermSpecAmt.at(year)) / 100.0;
rd.output_values[i] = '$' + ledger_format(z, f0);
if(is_composite)
{
@@ -593,7 +593,7 @@ void group_quote_pdf_generator_wx::add_ledger(Ledger const&
ledger)
break;
case e_col_total_premium:
{
- double const z = invar.ModalMinimumPremium.at(year);
+ double const z = invar.ModalMinimumPremium.at(year) / 100.0;
rd.output_values[i] = '$' + ledger_format(z, f2);
if(is_composite)
{
diff --git a/ihs_acctval.cpp b/ihs_acctval.cpp
index b076b6db..5da5a47d 100644
--- a/ihs_acctval.cpp
+++ b/ihs_acctval.cpp
@@ -149,7 +149,7 @@ AccountValue::AccountValue(Input const& input)
currency AccountValue::base_specamt(int year) const
{
// CURRENCY !! Cents in ledger will make rounding unnecessary.
- return round_specamt().c(InvariantValues().SpecAmt[year]);
+ return round_specamt().c(InvariantValues().SpecAmt[year] / 100.0);
}
/// Specified amount of term rider.
@@ -157,7 +157,7 @@ currency AccountValue::base_specamt(int year) const
currency AccountValue::term_specamt(int year) const
{
// CURRENCY !! Cents in ledger will make rounding unnecessary.
- return round_specamt().c(InvariantValues().TermSpecAmt[year]);
+ return round_specamt().c(InvariantValues().TermSpecAmt[year] / 100.0);
}
/// Specified amount for 7702 (not 7702A).
@@ -498,8 +498,8 @@ void AccountValue::InitializeLife(mcenum_run_basis a_Basis)
LMI_ASSERT(materially_equal(gpt7702_->raw_glp(), Irc7702_->glp()));
LMI_ASSERT(materially_equal(gpt7702_->raw_gsp(), Irc7702_->gsp()));
- InvariantValues().InitGLP = dblize(gpt7702_->rounded_glp());
- InvariantValues().InitGSP = dblize(gpt7702_->rounded_gsp());
+ InvariantValues().InitGLP = centize(gpt7702_->rounded_glp());
+ InvariantValues().InitGSP = centize(gpt7702_->rounded_gsp());
// This is notionally called once per *current*-basis run
// and actually called once per run, with calculations suppressed
@@ -972,7 +972,7 @@ void AccountValue::InitializeSpecAmt()
if(0 == Year)
{
- InvariantValues().InitTgtPrem = dblize(AnnualTargetPrem);
+ InvariantValues().InitTgtPrem = centize(AnnualTargetPrem);
}
// TODO ?? Perform specamt strategy here?
@@ -1011,8 +1011,8 @@ void AccountValue::set_list_bill_premium()
,Outlay_->er_premium_modes()[Year]
,base_specamt(Year)
);
- InvariantValues().ListBillPremium = dblize(z);
- InvariantValues().ErListBillPremium = dblize(z);
+ InvariantValues().ListBillPremium = centize(z);
+ InvariantValues().ErListBillPremium = centize(z);
}
else
{
@@ -1022,9 +1022,9 @@ void AccountValue::set_list_bill_premium()
,base_specamt(Year)
,term_specamt(Year)
);
- InvariantValues().EeListBillPremium = dblize(z.first);
- InvariantValues().ErListBillPremium = dblize(z.second);
- InvariantValues().ListBillPremium = dblize(z.first + z.second);
+ InvariantValues().EeListBillPremium = centize(z.first);
+ InvariantValues().ErListBillPremium = centize(z.second);
+ InvariantValues().ListBillPremium = centize(z.first + z.second);
}
}
@@ -1049,8 +1049,8 @@ void AccountValue::set_modal_min_premium()
,Outlay_->er_premium_modes()[Year]
,base_specamt(Year)
);
- InvariantValues().ModalMinimumPremium[Year] = dblize(z);
- InvariantValues().ErModalMinimumPremium[Year] = dblize(z);
+ InvariantValues().ModalMinimumPremium[Year] = centize(z);
+ InvariantValues().ErModalMinimumPremium[Year] = centize(z);
}
else
{
@@ -1060,9 +1060,9 @@ void AccountValue::set_modal_min_premium()
,base_specamt(Year)
,term_specamt(Year)
);
- InvariantValues().EeModalMinimumPremium[Year] = dblize(z.first);
- InvariantValues().ErModalMinimumPremium[Year] = dblize(z.second);
- InvariantValues().ModalMinimumPremium[Year] = dblize(z.first +
z.second);
+ InvariantValues().EeModalMinimumPremium[Year] = centize(z.first);
+ InvariantValues().ErModalMinimumPremium[Year] = centize(z.second);
+ InvariantValues().ModalMinimumPremium[Year] = centize(z.first +
z.second);
}
}
@@ -1173,7 +1173,7 @@ void AccountValue::SetClaims()
void AccountValue::FinalizeYear()
{
- VariantValues().TotalLoanBalance[Year] = dblize(RegLnBal + PrfLnBal);
+ VariantValues().TotalLoanBalance[Year] = centize(RegLnBal + PrfLnBal);
currency total_av = TotalAccountValue();
currency surr_chg = SurrChg();
@@ -1227,14 +1227,14 @@ void AccountValue::FinalizeYear()
}
cv_7702 = std::max(cv_7702, HoneymoonValue);
- VariantValues().AcctVal [Year] = dblize(total_av);
- VariantValues().AVGenAcct [Year] = dblize(AVGenAcct + AVRegLn + AVPrfLn);
- VariantValues().AVSepAcct [Year] = dblize(AVSepAcct);
+ VariantValues().AcctVal [Year] = centize(total_av);
+ VariantValues().AVGenAcct [Year] = centize(AVGenAcct + AVRegLn +
AVPrfLn);
+ VariantValues().AVSepAcct [Year] = centize(AVSepAcct);
VariantValues().DacTaxRsv [Year] = DacTaxRsv;
- VariantValues().CSVNet [Year] = dblize(csv_net);
- VariantValues().CV7702 [Year] = dblize(cv_7702);
+ VariantValues().CSVNet [Year] = centize(csv_net);
+ VariantValues().CV7702 [Year] = centize(cv_7702);
- InvariantValues().Dcv [Year] = dblize(Dcv);
+ InvariantValues().Dcv [Year] = centize(Dcv);
// Update death benefit. 'DBReflectingCorr' currently equals the
// death benefit as of the beginning of the twelfth month, but its
@@ -1244,26 +1244,26 @@ void AccountValue::FinalizeYear()
TxSetDeathBft();
TxSetTermAmt();
// post values to LedgerVariant
- InvariantValues().TermSpecAmt [Year] = dblize(TermSpecAmt);
- VariantValues().TermPurchased [Year] = dblize(TermDB);
+ InvariantValues().TermSpecAmt [Year] = centize(TermSpecAmt);
+ VariantValues().TermPurchased [Year] = centize(TermDB);
// Add term rider DB
- VariantValues().BaseDeathBft [Year] = dblize(DBReflectingCorr);
- VariantValues().EOYDeathBft [Year] = dblize(DBReflectingCorr + TermDB);
+ VariantValues().BaseDeathBft [Year] = centize(DBReflectingCorr);
+ VariantValues().EOYDeathBft [Year] = centize(DBReflectingCorr +
TermDB);
// Monthly deduction detail
- VariantValues().COICharge [Year] = dblize(YearsTotalCoiCharge) ;
- VariantValues().RiderCharges [Year] = dblize(YearsTotalRiderCharges) ;
+ VariantValues().COICharge [Year] = centize(YearsTotalCoiCharge) ;
+ VariantValues().RiderCharges [Year] = centize(YearsTotalRiderCharges)
;
VariantValues().AVRelOnDeath [Year] = YearsAVRelOnDeath ;
VariantValues().ClaimsPaid [Year] = YearsGrossClaims ;
VariantValues().DeathProceedsPaid [Year] = YearsDeathProceeds ;
VariantValues().NetClaims [Year] = YearsNetClaims ;
- VariantValues().NetIntCredited [Year] =
dblize(YearsTotalNetIntCredited);
- VariantValues().GrossIntCredited [Year] =
dblize(YearsTotalGrossIntCredited);
- VariantValues().LoanIntAccrued [Year] =
dblize(YearsTotalLoanIntAccrued);
- VariantValues().PolicyFee [Year] = dblize(YearsTotalPolicyFee) ;
+ VariantValues().NetIntCredited [Year] =
centize(YearsTotalNetIntCredited);
+ VariantValues().GrossIntCredited [Year] =
centize(YearsTotalGrossIntCredited);
+ VariantValues().LoanIntAccrued [Year] =
centize(YearsTotalLoanIntAccrued);
+ VariantValues().PolicyFee [Year] = centize(YearsTotalPolicyFee)
;
VariantValues().DacTaxLoad [Year] = YearsTotalDacTaxLoad ;
- VariantValues().SpecAmtLoad [Year] = dblize(YearsTotalSpecAmtLoad) ;
+ VariantValues().SpecAmtLoad [Year] = centize(YearsTotalSpecAmtLoad) ;
VariantValues().PremTaxLoad [Year] = PremiumTax_->ytd_load() ;
currency notional_sep_acct_charge =
@@ -1271,7 +1271,7 @@ void AccountValue::FinalizeYear()
+ YearsTotalGrossIntCredited
- YearsTotalNetIntCredited
;
- VariantValues().SepAcctCharges [Year] =
dblize(notional_sep_acct_charge);
+ VariantValues().SepAcctCharges [Year] =
centize(notional_sep_acct_charge);
// Record dynamic interest rate in ledger object.
//
@@ -1305,7 +1305,7 @@ void AccountValue::FinalizeYear()
);
}
- VariantValues().NetPmt[Year] = dblize(std::accumulate
+ VariantValues().NetPmt[Year] = centize(std::accumulate
(NetPmts.begin()
,NetPmts.end()
,-YearsTotalGptForceout
@@ -1328,15 +1328,15 @@ void AccountValue::FinalizeYear()
// Forceouts should be a distinct component, passed separately
// to ledger values. Probably we should treat 1035 exchanges
// and NAAR 'forceouts' the same way.
- InvariantValues().GrossPmt [Year] -= dblize(YearsTotalGptForceout);
- InvariantValues().EeGrossPmt[Year] -= dblize(YearsTotalGptForceout);
+ InvariantValues().GrossPmt [Year] -= centize(YearsTotalGptForceout);
+ InvariantValues().EeGrossPmt[Year] -= centize(YearsTotalGptForceout);
for(int j = 0; j < 12; ++j)
{
assert_pmts_add_up(__FILE__, __LINE__, j);
- InvariantValues().GrossPmt [Year] += dblize(GrossPmts [j]);
- InvariantValues().EeGrossPmt[Year] += dblize(EeGrossPmts[j]);
- InvariantValues().ErGrossPmt[Year] += dblize(ErGrossPmts[j]);
+ InvariantValues().GrossPmt [Year] += centize(GrossPmts [j]);
+ InvariantValues().EeGrossPmt[Year] += centize(EeGrossPmts[j]);
+ InvariantValues().ErGrossPmt[Year] += centize(ErGrossPmts[j]);
}
if(0 == Year)
{
@@ -1355,7 +1355,7 @@ void AccountValue::FinalizeYear()
- InvariantValues().NewCashLoan[Year]
;
- InvariantValues().GptForceout[Year] = dblize(YearsTotalGptForceout);
+ InvariantValues().GptForceout[Year] = centize(YearsTotalGptForceout);
// SOMEDAY !! Not yet implemented.
// InvariantValues().NaarForceout[Year] =
InvariantValues().ErGrossPmt[Year];
diff --git a/ihs_avmly.cpp b/ihs_avmly.cpp
index 1eb241a3..7c3e6f04 100644
--- a/ihs_avmly.cpp
+++ b/ihs_avmly.cpp
@@ -815,12 +815,12 @@ void AccountValue::ChangeSpecAmtBy(currency delta)
// TODO ?? Shouldn't this be moved to FinalizeMonth()? The problem is
// that the ledger object is used for working storage, where it should
// probably be write-only instead.
- InvariantValues().SpecAmt[j] = dblize(ActualSpecAmt);
+ InvariantValues().SpecAmt[j] = centize(ActualSpecAmt);
// Adjust term here only if it's formally a rider.
// Otherwise, its amount should not have been changed.
if(!TermIsNotRider)
{
- InvariantValues().TermSpecAmt[j] = dblize(TermSpecAmt);
+ InvariantValues().TermSpecAmt[j] = centize(TermSpecAmt);
}
// Term specamt is a vector in class LedgerInvariant, but a scalar in
// the input classes, e.g.:
@@ -845,7 +845,7 @@ void AccountValue::ChangeSupplAmtBy(currency delta)
// At least for now, there is no effect on surrender charges.
for(int j = Year; j < BasicValues::GetLength(); ++j)
{
- InvariantValues().TermSpecAmt[j] = dblize(TermSpecAmt);
+ InvariantValues().TermSpecAmt[j] = centize(TermSpecAmt);
}
// Reset term DB whenever term SA changes. It's not obviously
// necessary to do this here, but neither should it do any harm.
@@ -1018,10 +1018,10 @@ void AccountValue::TxSpecAmtChange()
,minimum_specified_amount(0 == Year && 0 == Month,
TermRiderActive)
);
ActualSpecAmt = round_specamt().c(ActualSpecAmt); // CURRENCY !!
already rounded?
- InvariantValues().SpecAmt[j] = dblize(ActualSpecAmt);
+ InvariantValues().SpecAmt[j] = centize(ActualSpecAmt);
if(!TermIsNotRider)
{
- InvariantValues().TermSpecAmt[j] = dblize(TermSpecAmt);
+ InvariantValues().TermSpecAmt[j] = centize(TermSpecAmt);
}
}
// Set BOM DB for 7702 and 7702A.
@@ -1608,7 +1608,7 @@ void AccountValue::TxLoanRepay()
// This seems wrong. If we're changing something that's invariant among
// bases, why do we change it for each basis?
// TODO ?? Shouldn't this be moved to FinalizeMonth()?
- InvariantValues().NewCashLoan[Year] = dblize(ActualLoan);
+ InvariantValues().NewCashLoan[Year] = centize(ActualLoan);
// TODO ?? Consider changing loan_ullage_[Year] here.
}
@@ -1840,7 +1840,7 @@ void AccountValue::EndTermRider(bool convert)
// Carry the new term spec amt forward into all future years.
for(int j = Year; j < BasicValues::GetLength(); ++j)
{
- InvariantValues().TermSpecAmt[j] = dblize(TermSpecAmt);
+ InvariantValues().TermSpecAmt[j] = centize(TermSpecAmt);
}
}
@@ -2668,7 +2668,7 @@ void AccountValue::TxTakeWD()
// This seems wrong. If we're changing something that's invariant among
// bases, why do we change it for each basis?
// TODO ?? Shouldn't this be moved to FinalizeMonth()?
- InvariantValues().NetWD[Year] = dblize(NetWD);
+ InvariantValues().NetWD[Year] = centize(NetWD);
}
/// Calculate maximum permissible total loan (not increment).
@@ -2774,7 +2774,7 @@ void AccountValue::TxTakeLoan()
ActualLoan = std::min(max_loan_increment, RequestedLoan);
ActualLoan = std::max(ActualLoan, C0);
// TODO ?? Shouldn't this happen in FinalizeMonth()?
- InvariantValues().NewCashLoan[Year] = dblize(ActualLoan);
+ InvariantValues().NewCashLoan[Year] = centize(ActualLoan);
}
{
@@ -2943,9 +2943,9 @@ void AccountValue::FinalizeMonth()
{
if(0 == Year && 0 == Month)
{
- InvariantValues().External1035Amount = dblize(External1035Amount);
- InvariantValues().Internal1035Amount = dblize(Internal1035Amount);
- InvariantValues().Dumpin = dblize(Dumpin);
+ InvariantValues().External1035Amount = centize(External1035Amount);
+ InvariantValues().Internal1035Amount = centize(Internal1035Amount);
+ InvariantValues().Dumpin = centize(Dumpin);
}
// TAXATION !! We could also capture MEC status on other bases here.
diff --git a/ihs_avsolve.cpp b/ihs_avsolve.cpp
index 397bec43..f4dc859a 100644
--- a/ihs_avsolve.cpp
+++ b/ihs_avsolve.cpp
@@ -205,11 +205,13 @@ currency AccountValue::SolveTest
if(no_lapse_dur < SolveTargetDuration_)
{
// CURRENCY !! Cents in ledger will make rounding unnecessary.
+ // But is that true? Ledger contains cents as double, not as currency.
most_negative_csv = round_minutiae().c
(*std::min_element
(VariantValues().CSVNet.begin() + no_lapse_dur
,VariantValues().CSVNet.begin() + SolveTargetDuration_
)
+ / 100.0
);
}
@@ -236,14 +238,18 @@ currency AccountValue::SolveTest
// counters and iterators--it's one past the end--but indexing
// must decrement it.
// CURRENCY !! Cents in ledger will make rounding unnecessary.
- currency value =
round_minutiae().c(VariantValues().CSVNet[SolveTargetDuration_ - 1]);
+ // But is that true? Ledger contains cents as double, not as currency.
+ currency value =
round_minutiae().c(VariantValues().CSVNet[SolveTargetDuration_ - 1] / 100.0);
if(mce_solve_for_target_naar == SolveTarget_)
{
// CURRENCY !! Cents in ledger will make rounding unnecessary.
value = round_minutiae().c
(
- VariantValues().EOYDeathBft[SolveTargetDuration_ - 1]
- - VariantValues().AcctVal [SolveTargetDuration_ - 1]
+ (
+ VariantValues().EOYDeathBft[SolveTargetDuration_ - 1]
+ - VariantValues().AcctVal [SolveTargetDuration_ - 1]
+ )
+ / 100.0
);
}
if(worst_negative < C0)
diff --git a/ledger.cpp b/ledger.cpp
index b3a55d93..0f4d162f 100644
--- a/ledger.cpp
+++ b/ledger.cpp
@@ -489,7 +489,7 @@ std::vector<double> numeric_vector
{
attained_age [j] = j + invar.Age;
policy_year [j] = j + 1 ;
- net_death_benefit[j] = curr.EOYDeathBft[j] - curr.TotalLoanBalance[j];
+ net_death_benefit[j] = (curr.EOYDeathBft[j] -
curr.TotalLoanBalance[j]) / 100.0;
}
typedef LedgerBase const& B;
diff --git a/ledger_evaluator.cpp b/ledger_evaluator.cpp
index 6f5f128e..407b93d5 100644
--- a/ledger_evaluator.cpp
+++ b/ledger_evaluator.cpp
@@ -435,6 +435,8 @@ format_map_t static_formats()
std::pair<int,oenum_format_style> f2(2, oe_format_normal);
std::pair<int,oenum_format_style> f3(0, oe_format_percentage);
std::pair<int,oenum_format_style> f4(2, oe_format_percentage);
+ std::pair<int,oenum_format_style> f5(0, oe_cents_as_dollars);
+ std::pair<int,oenum_format_style> f6(2, oe_cents_as_dollars);
static format_map_t const format_map =
// > Special Formatting for Scalar Items
@@ -472,17 +474,17 @@ format_map_t static_formats()
// > Format as a number with thousand separators and two decimal places
(#,###,###.00)
// >
,{"CurrentCoiMultiplier" , f2}
- ,{"EeListBillPremium" , f2}
- ,{"ErListBillPremium" , f2}
+ ,{"EeListBillPremium" , f6}
+ ,{"ErListBillPremium" , f6}
,{"GuarPrem" , f2}
,{"InforceTaxBasis" , f2}
,{"InforceTotalAV" , f2}
- ,{"InitGLP" , f2}
- ,{"InitGSP" , f2}
- ,{"InitPrem" , f2}
+ ,{"InitGLP" , f6}
+ ,{"InitGSP" , f6}
+ ,{"InitPrem" , f6}
,{"InitSevenPayPrem" , f2}
- ,{"InitTgtPrem" , f2}
- ,{"ListBillPremium" , f2}
+ ,{"InitTgtPrem" , f6}
+ ,{"ListBillPremium" , f6}
// >
// F1: zero decimals, commas
// > Format as a number with thousand separators and no decimal places
(#,###,###)
@@ -492,10 +494,10 @@ format_map_t static_formats()
,{"AvgFund" , f1}
,{"ChildRiderAmount" , f1}
,{"CustomFund" , f1}
- ,{"Dumpin" , f1}
+ ,{"Dumpin" , f5}
,{"EndtAge" , f1}
,{"ErNotionallyPaysTerm" , f1}
- ,{"External1035Amount" , f1}
+ ,{"External1035Amount" , f5}
,{"GenderBlended" , f1}
,{"GreatestLapseDuration" , f1}
,{"GroupIndivSelection" , f1}
@@ -510,10 +512,10 @@ format_map_t static_formats()
,{"InforceIsMec" , f1}
,{"InforceMonth" , f1}
,{"InforceYear" , f1}
- ,{"InitBaseSpecAmt" , f1}
- ,{"InitTermSpecAmt" , f1}
- ,{"InitTotalSA" , f1}
- ,{"Internal1035Amount" , f1}
+ ,{"InitBaseSpecAmt" , f5}
+ ,{"InitTermSpecAmt" , f5}
+ ,{"InitTotalSA" , f5}
+ ,{"Internal1035Amount" , f5}
,{"IsInforce" , f1}
,{"IsMec" , f1}
,{"IsSinglePremium" , f1}
@@ -610,62 +612,62 @@ format_map_t static_formats()
// F1: zero decimals, commas
// > Format as a number with thousand separators and no decimal places
(#,###,##0)
// >
- ,{"AVGenAcct" , f1}
+ ,{"AVGenAcct" , f5}
,{"AVRelOnDeath" , f1}
- ,{"AVSepAcct" , f1}
- ,{"AcctVal" , f1}
+ ,{"AVSepAcct" , f5}
+ ,{"AcctVal" , f5}
,{"AccumulatedPremium" , f1}
,{"AddonCompOnAssets" , f1}
,{"AddonCompOnPremium" , f1}
,{"AvgDeathBft" , f1}
,{"BOYAssets" , f1}
- ,{"BaseDeathBft" , f1}
- ,{"COICharge" , f1}
- ,{"CSVNet" , f1}
- ,{"CV7702" , f1}
+ ,{"BaseDeathBft" , f5}
+ ,{"COICharge" , f5}
+ ,{"CSVNet" , f5}
+ ,{"CV7702" , f5}
,{"ClaimsPaid" , f1}
,{"Composite" , f1}
,{"DacTaxLoad" , f1}
,{"DacTaxRsv" , f1}
- ,{"Dcv" , f1}
+ ,{"Dcv" , f5}
,{"DeathProceedsPaid" , f1}
- ,{"EOYDeathBft" , f1}
- ,{"EeGrossPmt" , f1}
- ,{"EeModalMinimumPremium" , f1}
+ ,{"EOYDeathBft" , f5}
+ ,{"EeGrossPmt" , f5}
+ ,{"EeModalMinimumPremium" , f5}
// ,{"EeMode" , f1} // Not numeric.
- ,{"ErGrossPmt" , f1}
- ,{"ErModalMinimumPremium" , f1}
+ ,{"ErGrossPmt" , f5}
+ ,{"ErModalMinimumPremium" , f5}
// ,{"ErMode" , f1} // Not numeric.
,{"ExpenseCharges" , f1}
,{"FundNumbers" , f1}
- ,{"GptForceout" , f1}
- ,{"GrossIntCredited" , f1}
- ,{"GrossPmt" , f1}
+ ,{"GptForceout" , f5}
+ ,{"GrossIntCredited" , f5}
+ ,{"GrossPmt" , f5}
,{"Loads" , f1}
,{"LoanInt" , f1}
- ,{"LoanIntAccrued" , f1}
- ,{"ModalMinimumPremium" , f1}
+ ,{"LoanIntAccrued" , f5}
+ ,{"ModalMinimumPremium" , f5}
,{"NaarForceout" , f1}
,{"NetClaims" , f1}
- ,{"NetIntCredited" , f1}
- ,{"NetPmt" , f1}
- ,{"NetWD" , f1}
- ,{"NewCashLoan" , f1}
- ,{"Outlay" , f1}
- ,{"PolicyFee" , f1}
+ ,{"NetIntCredited" , f5}
+ ,{"NetPmt" , f5}
+ ,{"NetWD" , f5}
+ ,{"NewCashLoan" , f5}
+ ,{"Outlay" , f5}
+ ,{"PolicyFee" , f5}
,{"PrefLoanBalance" , f1}
,{"PremTaxLoad" , f1}
,{"RefundableSalesLoad" , f1}
- ,{"RiderCharges" , f1}
+ ,{"RiderCharges" , f5}
,{"Salary" , f1}
- ,{"SepAcctCharges" , f1}
- ,{"SpecAmt" , f1}
- ,{"SpecAmtLoad" , f1}
+ ,{"SepAcctCharges" , f5}
+ ,{"SpecAmt" , f5}
+ ,{"SpecAmtLoad" , f5}
,{"SpouseRiderAmount" , f1}
- ,{"SurrChg" , f1}
- ,{"TermPurchased" , f1}
- ,{"TermSpecAmt" , f1}
- ,{"TotalLoanBalance" , f1}
+ ,{"SurrChg" , f5}
+ ,{"TermPurchased" , f5}
+ ,{"TermSpecAmt" , f5}
+ ,{"TotalLoanBalance" , f5}
};
return format_map;
@@ -688,6 +690,8 @@ ledger_evaluator Ledger::make_evaluator() const
// std::pair<int,oenum_format_style> f2(2, oe_format_normal); // not used
std::pair<int,oenum_format_style> f3(0, oe_format_percentage);
// std::pair<int,oenum_format_style> f4(2, oe_format_percentage); // not used
+ std::pair<int,oenum_format_style> f5(0, oe_cents_as_dollars);
+// std::pair<int,oenum_format_style> f6(2, oe_cents_as_dollars); // not used
format_map_t format_map {static_formats()};
@@ -763,19 +767,19 @@ ledger_evaluator Ledger::make_evaluator() const
vectors ["PremiumLoad"] = &PremiumLoad;
title_map ["PremiumLoad"] = "Premium\nLoad";
mask_map ["PremiumLoad"] = "999,999,999";
- format_map["PremiumLoad"] = f1;
+ format_map["PremiumLoad"] = f5;
vectors ["MiscCharges"] = &MiscCharges;
title_map ["MiscCharges"] = "Miscellaneous\nCharges";
mask_map ["MiscCharges"] = "999,999,999";
- format_map["MiscCharges"] = f1;
+ format_map["MiscCharges"] = f5;
std::vector<double> NetDeathBenefit(curr.EOYDeathBft);
NetDeathBenefit -= curr.TotalLoanBalance;
vectors ["NetDeathBenefit"] = &NetDeathBenefit;
title_map ["NetDeathBenefit"] = "Net\nDeath\nBenefit";
mask_map ["NetDeathBenefit"] = "999,999,999";
- format_map["NetDeathBenefit"] = f1;
+ format_map["NetDeathBenefit"] = f5;
std::vector<double> SupplDeathBft_Current (curr.TermPurchased);
std::vector<double> SupplDeathBft_Guaranteed(guar.TermPurchased);
@@ -785,14 +789,14 @@ ledger_evaluator Ledger::make_evaluator() const
title_map ["SupplDeathBft_Guaranteed"] = "Guar Suppl\nDeath\nBenefit";
mask_map ["SupplDeathBft_Current" ] = "999,999,999";
mask_map ["SupplDeathBft_Guaranteed"] = "999,999,999";
- format_map["SupplDeathBft_Current" ] = f1;
- format_map["SupplDeathBft_Guaranteed"] = f1;
+ format_map["SupplDeathBft_Current" ] = f5;
+ format_map["SupplDeathBft_Guaranteed"] = f5;
std::vector<double> SupplSpecAmt(invar.TermSpecAmt);
vectors ["SupplSpecAmt" ] = &SupplSpecAmt;
title_map ["SupplSpecAmt" ] = "Suppl\nSpecified\nAmount";
mask_map ["SupplSpecAmt" ] = "999,999,999";
- format_map["SupplSpecAmt" ] = f1;
+ format_map["SupplSpecAmt" ] = f5;
// [End of derived columns.]
diff --git a/ledger_invariant_init.cpp b/ledger_invariant_init.cpp
index 774ae9cc..da360bfc 100644
--- a/ledger_invariant_init.cpp
+++ b/ledger_invariant_init.cpp
@@ -105,11 +105,11 @@ void LedgerInvariant::Init(BasicValues const* b)
HasSupplSpecAmt = false;
if(b->yare_input_.TermRider)
{
- TermSpecAmt .assign(Length, b->yare_input_.TermRiderAmount);
+ TermSpecAmt .assign(Length, b->yare_input_.TermRiderAmount
* 100.0);
}
else if(b->database().query<bool>(DB_TermIsNotRider))
{
- TermSpecAmt = dblize(b->DeathBfts_->supplamt());
+ TermSpecAmt = centize(b->DeathBfts_->supplamt());
if(!each_equal(TermSpecAmt, 0.0))
{
HasSupplSpecAmt = true;
@@ -119,7 +119,7 @@ void LedgerInvariant::Init(BasicValues const* b)
{
TermSpecAmt .assign(Length, 0.0);
}
- SpecAmt = dblize(b->DeathBfts_->specamt());
+ SpecAmt = centize(b->DeathBfts_->specamt());
// Dcv = DYNAMIC
// Forborne vectors.
@@ -158,7 +158,7 @@ void LedgerInvariant::Init(BasicValues const* b)
// Scalable scalars.
// SOMEDAY !! Things indexed with '[0]' should probably use inforce year
instead.
- InitBaseSpecAmt = dblize(b->DeathBfts_->specamt()[0]);
+ InitBaseSpecAmt = centize(b->DeathBfts_->specamt()[0]);
InitTermSpecAmt = TermSpecAmt[0];
ChildRiderAmount = b->yare_input_.ChildRiderAmount;
SpouseRiderAmount = b->yare_input_.SpouseRiderAmount;
@@ -731,11 +731,11 @@ void LedgerInvariant::ReInit(BasicValues const* b)
HasSupplSpecAmt = false;
if(b->yare_input_.TermRider)
{
- TermSpecAmt .assign(Length, b->yare_input_.TermRiderAmount);
+ TermSpecAmt .assign(Length, b->yare_input_.TermRiderAmount
* 100.0);
}
else if(b->database().query<bool>(DB_TermIsNotRider))
{
- TermSpecAmt = dblize(b->DeathBfts_->supplamt());
+ TermSpecAmt = centize(b->DeathBfts_->supplamt());
if(!each_equal(TermSpecAmt, 0.0))
{
HasSupplSpecAmt = true;
@@ -745,9 +745,9 @@ void LedgerInvariant::ReInit(BasicValues const* b)
{
TermSpecAmt .assign(Length, 0.0);
}
- SpecAmt = dblize(b->DeathBfts_->specamt());
+ SpecAmt = centize(b->DeathBfts_->specamt());
- InitBaseSpecAmt = dblize(b->DeathBfts_->specamt()[0]);
+ InitBaseSpecAmt = centize(b->DeathBfts_->specamt()[0]);
InitTermSpecAmt = TermSpecAmt[0];
IsMec = false;
diff --git a/ledger_text_formats.cpp b/ledger_text_formats.cpp
index 47bf3fe7..cddd83d9 100644
--- a/ledger_text_formats.cpp
+++ b/ledger_text_formats.cpp
@@ -72,53 +72,53 @@ std::map<std::string,ledger_metadata> const&
ledger_metadata_map()
m["AttainedAge" ] = ledger_metadata(0, oe_format_normal
, "Attained Age" );
m["PolicyYear" ] = ledger_metadata(0, oe_format_normal
, "Policy Year" );
m["InforceLives" ] = ledger_metadata(4, oe_format_normal
, "BOY Lives Inforce" ); // "Inforce Lives BOY"
- m["SpecAmt" ] = ledger_metadata(0, oe_format_normal
, "Specified Amount" ); // "Base Specified Amount"
- m["TermSpecAmt" ] = ledger_metadata(0, oe_format_normal
, "Term Specified Amount" );
- m["SupplSpecAmt" ] = ledger_metadata(0, oe_format_normal
, "Suppl Specified Amount" ); // "Supplemental Specified
Amount"
+ m["SpecAmt" ] = ledger_metadata(0,
oe_cents_as_dollars , "Specified Amount" ); // "Base
Specified Amount"
+ m["TermSpecAmt" ] = ledger_metadata(0,
oe_cents_as_dollars , "Term Specified Amount" );
+ m["SupplSpecAmt" ] = ledger_metadata(0,
oe_cents_as_dollars , "Suppl Specified Amount" ); //
"Supplemental Specified Amount"
m["CorridorFactor" ] = ledger_metadata(0,
oe_format_percentage, "Corridor Factor" );
m["AnnGAIntRate_Current" ] = ledger_metadata(2,
oe_format_percentage, "Curr Ann Gen Acct Int Rate" ); // "General
Account Crediting Rate"
m["AnnSAIntRate_Current" ] = ledger_metadata(2,
oe_format_percentage, "Curr Ann Sep Acct Int Rate" ); // "Separate
Account Net Rate"
- m["Outlay" ] = ledger_metadata(0, oe_format_normal
, "Net Outlay" );
- m["EeGrossPmt" ] = ledger_metadata(0, oe_format_normal
, "EE Gross Payment" ); // "Employee Gross Payment"
- m["ErGrossPmt" ] = ledger_metadata(0, oe_format_normal
, "ER Gross Payment" ); // "Employer Gross Payment"
- m["ModalMinimumPremium" ] = ledger_metadata(0, oe_format_normal
, "Modal Minimum Premium" );
- m["EeModalMinimumPremium" ] = ledger_metadata(0, oe_format_normal
, "EE Modal Minimum Premium" );
- m["ErModalMinimumPremium" ] = ledger_metadata(0, oe_format_normal
, "ER Modal Minimum Premium" );
- m["NetWD" ] = ledger_metadata(0, oe_format_normal
, "Withdrawal" );
- m["NewCashLoan" ] = ledger_metadata(0, oe_format_normal
, "Annual Loan" ); // "New Cash Loan"
- m["TotalLoanBalance_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Total Loan Balance" ); // "Current Total Loan Balance"
- m["TotalLoanBalance_Guaranteed"] = ledger_metadata(0, oe_format_normal
, "Guar Total Loan Balance" ); // "Guaranteed Total Loan
Balance"
- m["AcctVal_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Account Value" ); // "Current Account Value"
- m["AcctVal_Guaranteed" ] = ledger_metadata(0, oe_format_normal
, "Guar Account Value" ); // "Guaranteed Account Value"
- m["CSVNet_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Net Cash Surr Value" ); // "Current Cash Surrender
Value"
- m["CSVNet_Guaranteed" ] = ledger_metadata(0, oe_format_normal
, "Guar Net Cash Surr Value" ); // "Guaranteed Cash Surrender
Value"
- m["EOYDeathBft_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr EOY Death Benefit" ); // "Current Death Benefit"
- m["EOYDeathBft_Guaranteed" ] = ledger_metadata(0, oe_format_normal
, "Guar EOY Death Benefit" ); // "Guaranteed Death Benefit"
- m["BaseDeathBft_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Base Death Benefit" ); // "Current Base Death Benefit"
- m["BaseDeathBft_Guaranteed" ] = ledger_metadata(0, oe_format_normal
, "Guar Base Death Benefit" ); // "Guaranteed Base Death
Benefit"
- m["TermPurchased_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Term Amt Purchased" ); // "Current Term Purchased"
- m["TermPurchased_Guaranteed" ] = ledger_metadata(0, oe_format_normal
, "Guar Term Amt Purchased" ); // "Guaranteed Term Purchased"
- m["SupplDeathBft_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Suppl Death Benefit" ); // "Current Supplemental Death
Benefit"
- m["SupplDeathBft_Guaranteed" ] = ledger_metadata(0, oe_format_normal
, "Guar Suppl Death Benefit" ); // "Guaranteed Supplemental
Death Benefit"
- m["COICharge_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr COI Charge" ); // "Current Mortality Charge"
- m["COICharge_Guaranteed" ] = ledger_metadata(0, oe_format_normal
, "Guar COI Charge" ); // "Guaranteed Mortality Charge"
- m["RiderCharges_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Rider Charges" ); // "Current Rider Charges"
+ m["Outlay" ] = ledger_metadata(0,
oe_cents_as_dollars , "Net Outlay" );
+ m["EeGrossPmt" ] = ledger_metadata(0,
oe_cents_as_dollars , "EE Gross Payment" ); // "Employee
Gross Payment"
+ m["ErGrossPmt" ] = ledger_metadata(0,
oe_cents_as_dollars , "ER Gross Payment" ); // "Employer
Gross Payment"
+ m["ModalMinimumPremium" ] = ledger_metadata(0,
oe_cents_as_dollars , "Modal Minimum Premium" );
+ m["EeModalMinimumPremium" ] = ledger_metadata(0,
oe_cents_as_dollars , "EE Modal Minimum Premium" );
+ m["ErModalMinimumPremium" ] = ledger_metadata(0,
oe_cents_as_dollars , "ER Modal Minimum Premium" );
+ m["NetWD" ] = ledger_metadata(0,
oe_cents_as_dollars , "Withdrawal" );
+ m["NewCashLoan" ] = ledger_metadata(0,
oe_cents_as_dollars , "Annual Loan" ); // "New Cash
Loan"
+ m["TotalLoanBalance_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Total Loan Balance" ); // "Current
Total Loan Balance"
+ m["TotalLoanBalance_Guaranteed"] = ledger_metadata(0,
oe_cents_as_dollars , "Guar Total Loan Balance" ); // "Guaranteed
Total Loan Balance"
+ m["AcctVal_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Account Value" ); // "Current
Account Value"
+ m["AcctVal_Guaranteed" ] = ledger_metadata(0,
oe_cents_as_dollars , "Guar Account Value" ); // "Guaranteed
Account Value"
+ m["CSVNet_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Net Cash Surr Value" ); // "Current
Cash Surrender Value"
+ m["CSVNet_Guaranteed" ] = ledger_metadata(0,
oe_cents_as_dollars , "Guar Net Cash Surr Value" ); // "Guaranteed
Cash Surrender Value"
+ m["EOYDeathBft_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr EOY Death Benefit" ); // "Current
Death Benefit"
+ m["EOYDeathBft_Guaranteed" ] = ledger_metadata(0,
oe_cents_as_dollars , "Guar EOY Death Benefit" ); // "Guaranteed
Death Benefit"
+ m["BaseDeathBft_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Base Death Benefit" ); // "Current
Base Death Benefit"
+ m["BaseDeathBft_Guaranteed" ] = ledger_metadata(0,
oe_cents_as_dollars , "Guar Base Death Benefit" ); // "Guaranteed
Base Death Benefit"
+ m["TermPurchased_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Term Amt Purchased" ); // "Current
Term Purchased"
+ m["TermPurchased_Guaranteed" ] = ledger_metadata(0,
oe_cents_as_dollars , "Guar Term Amt Purchased" ); // "Guaranteed
Term Purchased"
+ m["SupplDeathBft_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Suppl Death Benefit" ); // "Current
Supplemental Death Benefit"
+ m["SupplDeathBft_Guaranteed" ] = ledger_metadata(0,
oe_cents_as_dollars , "Guar Suppl Death Benefit" ); // "Guaranteed
Supplemental Death Benefit"
+ m["COICharge_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr COI Charge" ); // "Current
Mortality Charge"
+ m["COICharge_Guaranteed" ] = ledger_metadata(0,
oe_cents_as_dollars , "Guar COI Charge" ); // "Guaranteed
Mortality Charge"
+ m["RiderCharges_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Rider Charges" ); // "Current
Rider Charges"
m["IrrCsv_Current" ] = ledger_metadata(2,
oe_format_percentage, "Curr IRR on CSV" ); // "Current
Cash Value IRR"
m["IrrCsv_Guaranteed" ] = ledger_metadata(2,
oe_format_percentage, "Guar IRR on CSV" ); // "Guaranteed
Cash Value IRR"
m["IrrDb_Current" ] = ledger_metadata(2,
oe_format_percentage, "Curr IRR on DB" ); // "Current
Death Benefit IRR"
m["IrrDb_Guaranteed" ] = ledger_metadata(2,
oe_format_percentage, "Guar IRR on DB" ); // "Guaranteed
Death Benefit IRR"
m["NetClaims_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Net Claims" ); // "Experience Rating Current
Net Claims"
- m["GrossPmt" ] = ledger_metadata(0, oe_format_normal
, "Premium Outlay" ); // "Total Payment"
- m["LoanIntAccrued_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Loan Int Accrued" ); // "Current Accrued Loan
Interest"
- m["NetDeathBenefit" ] = ledger_metadata(0, oe_format_normal
, "Net Death Benefit" ); // "Current Net Death Benefit"
+ m["GrossPmt" ] = ledger_metadata(0,
oe_cents_as_dollars , "Premium Outlay" ); // "Total
Payment"
+ m["LoanIntAccrued_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Loan Int Accrued" ); // "Current
Accrued Loan Interest"
+ m["NetDeathBenefit" ] = ledger_metadata(0,
oe_cents_as_dollars , "Net Death Benefit" ); // "Current
Net Death Benefit"
m["DeathProceedsPaid_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Death Proceeds Paid" ); // "Current Death Proceeds Paid"
m["ClaimsPaid_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Claims Paid" ); // "Current Claims Paid"
m["AVRelOnDeath_Current" ] = ledger_metadata(0, oe_format_normal
, "Account Value Released on Death" ); // "Current Account Value
Released on Death"
- m["SpecAmtLoad_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Spec Amt Load" ); // "Current Load on Specified
Amount"
- m["GrossIntCredited_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Gross Int Credited" ); // "Current Interest Credited
before Separate Account Charges"
- m["NetIntCredited_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Net Int Credited" ); // "Current Interest Credited
Net of Separate Account Charges"
- m["SepAcctCharges_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Sep Acct Charges" ); // "Current Separate Account
Asset Charges"
- m["PolicyFee_Current" ] = ledger_metadata(0, oe_format_normal
, "Curr Policy Fee" ); // "Current Policy Fee"
+ m["SpecAmtLoad_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Spec Amt Load" ); // "Current
Load on Specified Amount"
+ m["GrossIntCredited_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Gross Int Credited" ); // "Current
Interest Credited before Separate Account Charges"
+ m["NetIntCredited_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Net Int Credited" ); // "Current
Interest Credited Net of Separate Account Charges"
+ m["SepAcctCharges_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Sep Acct Charges" ); // "Current
Separate Account Asset Charges"
+ m["PolicyFee_Current" ] = ledger_metadata(0,
oe_cents_as_dollars , "Curr Policy Fee" ); // "Current
Policy Fee"
}
return m;
@@ -269,20 +269,20 @@ std::string
calculation_summary_formatter::format_as_html() const
<< " <td align=\"right\" nowrap></td>\n"
<< " <td align=\"left\" nowrap></td>\n"
<< std::setprecision(2)
- << " <td align=\"right\" nowrap>" << invar_.InitGLP <<
"</td>\n"
+ << " <td align=\"right\" nowrap>" << invar_.InitGLP / 100.0 <<
"</td>\n"
<< " <td align=\"left\" nowrap> initial guideline level
premium</td>\n"
<< "</tr>\n"
<< "<tr>\n"
<< std::setprecision(0)
- << " <td align=\"right\" nowrap>" << invar_.InitBaseSpecAmt <<
"</td>\n"
+ << " <td align=\"right\" nowrap>" << invar_.InitBaseSpecAmt /
100.0 << "</td>\n"
<< " <td align=\"left\" nowrap> initial base specified
amount</td>\n"
<< std::setprecision(2)
- << " <td align=\"right\" nowrap>" << invar_.InitGSP <<
"</td>\n"
+ << " <td align=\"right\" nowrap>" << invar_.InitGSP / 100.0 <<
"</td>\n"
<< " <td align=\"left\" nowrap> initial guideline single
premium</td>\n"
<< "</tr>\n"
<< "<tr>\n"
<< std::setprecision(0)
- << " <td align=\"right\" nowrap>" << invar_.InitTermSpecAmt <<
"</td>\n"
+ << " <td align=\"right\" nowrap>" << invar_.InitTermSpecAmt /
100.0 << "</td>\n"
<< " <td align=\"left\" nowrap> initial term specified
amount</td>\n"
<< std::setprecision(2)
<< " <td align=\"right\" nowrap>" << invar_.InitSevenPayPrem <<
"</td>\n"
@@ -290,10 +290,10 @@ std::string
calculation_summary_formatter::format_as_html() const
<< "</tr>\n"
<< "<tr>\n"
<< std::setprecision(0)
- << " <td align=\"right\" nowrap>" << invar_.InitBaseSpecAmt +
invar_.InitTermSpecAmt << "</td>\n"
+ << " <td align=\"right\" nowrap>" << (invar_.InitBaseSpecAmt +
invar_.InitTermSpecAmt) / 100.0 << "</td>\n"
<< " <td align=\"left\" nowrap> initial total specified
amount</td>\n"
<< std::setprecision(2)
- << " <td align=\"right\" nowrap>" << invar_.InitTgtPrem <<
"</td>\n"
+ << " <td align=\"right\" nowrap>" << invar_.InitTgtPrem / 100.0
<< "</td>\n"
<< " <td align=\"left\" nowrap> initial target
premium</td>\n"
<< "</tr>\n"
<< "</table>\n"
@@ -365,25 +365,25 @@ std::string
calculation_summary_formatter::format_as_tsv() const
}
oss
<< std::setprecision(2)
- << invar_.InitGLP
+ << invar_.InitGLP / 100.0
<< "\tinitial guideline level premium\n"
<< std::setprecision(2)
- << invar_.InitGSP
+ << invar_.InitGSP / 100.0
<< "\tinitial guideline single premium\n"
<< std::setprecision(2)
<< invar_.InitSevenPayPrem
<< "\tinitial seven-pay premium\n"
<< std::setprecision(2)
- << invar_.InitTgtPrem
+ << invar_.InitTgtPrem / 100.0
<< "\tinitial target premium\n"
<< std::setprecision(0)
- << invar_.InitBaseSpecAmt
+ << invar_.InitBaseSpecAmt / 100.0
<< "\tinitial base specified amount\n"
<< std::setprecision(0)
- << invar_.InitTermSpecAmt
+ << invar_.InitTermSpecAmt / 100.0
<< "\tinitial term specified amount\n"
<< std::setprecision(0)
- << invar_.InitBaseSpecAmt + invar_.InitTermSpecAmt
+ << (invar_.InitBaseSpecAmt + invar_.InitTermSpecAmt) / 100.0
<< "\tinitial total specified amount\n"
;
}
@@ -466,10 +466,10 @@ void PrintCellTabDelimited
os << "Gender\t\t" << Invar.value_str("Gender" ) <<
'\n';
os << "Smoker\t\t" << Invar.value_str("Smoker" ) <<
'\n';
os << "IssueAge\t\t" << Invar.value_str("Age" ) <<
'\n';
- os << "InitBaseSpecAmt\t\t" << Invar.value_str("InitBaseSpecAmt") <<
'\n';
- os << "InitTermSpecAmt\t\t" << Invar.value_str("InitTermSpecAmt") <<
'\n';
+ os << "InitBaseSpecAmt\t\t" << Invar.value_str("InitBaseSpecAmt", 100.0)
<< '\n';
+ os << "InitTermSpecAmt\t\t" << Invar.value_str("InitTermSpecAmt", 100.0)
<< '\n';
double total_spec_amt = Invar.InitBaseSpecAmt + Invar.InitTermSpecAmt;
- os << " Total:\t\t" << value_cast<std::string>(total_spec_amt) <<
'\n';
+ os << " Total:\t\t" << value_cast<std::string>(total_spec_amt /
100.0) << '\n';
os << "PolicyMktgName\t\t" << Invar.value_str("PolicyMktgName" ) <<
'\n';
os << "PolicyForm\t\t" << Invar.value_str("PolicyForm" ) <<
'\n';
os << "UWClass\t\t" << Invar.value_str("UWClass" ) <<
'\n';
@@ -567,36 +567,36 @@ void PrintCellTabDelimited
os << Invar.DBOpt[j] << '\t';
}
- os << Invar.value_str("EeGrossPmt" ,j) << '\t';
- os << Invar.value_str("ErGrossPmt" ,j) << '\t';
- os << Invar.value_str("NetWD" ,j) << '\t'; // TODO ??
It's *gross* WD.
- os << Invar.value_str("NewCashLoan" ,j) << '\t';
- os << Curr_.value_str("TotalLoanBalance" ,j) << '\t';
- os << Invar.value_str("Outlay" ,j) << '\t';
+ os << Invar.value_str("EeGrossPmt" ,j, 100.0) << '\t';
+ os << Invar.value_str("ErGrossPmt" ,j, 100.0) << '\t';
+ os << Invar.value_str("NetWD" ,j, 100.0) << '\t'; //
TODO ?? It's *gross* WD.
+ os << Invar.value_str("NewCashLoan" ,j, 100.0) << '\t';
+ os << Curr_.value_str("TotalLoanBalance" ,j, 100.0) << '\t';
+ os << Invar.value_str("Outlay" ,j, 100.0) << '\t';
- os << Curr_.value_str("NetPmt" ,j) << '\t';
+ os << Curr_.value_str("NetPmt" ,j, 100.0) << '\t';
os << Curr_.value_str("PremTaxLoad" ,j) << '\t';
os << Curr_.value_str("DacTaxLoad" ,j) << '\t';
- os << Curr_.value_str("PolicyFee" ,j) << '\t';
- os << Curr_.value_str("SpecAmtLoad" ,j) << '\t';
+ os << Curr_.value_str("PolicyFee" ,j, 100.0) << '\t';
+ os << Curr_.value_str("SpecAmtLoad" ,j, 100.0) << '\t';
os << Invar.value_str("AnnualFlatExtra" ,j) << '\t';
- os << Curr_.value_str("COICharge" ,j) << '\t';
- os << Curr_.value_str("RiderCharges" ,j) << '\t';
+ os << Curr_.value_str("COICharge" ,j, 100.0) << '\t';
+ os << Curr_.value_str("RiderCharges" ,j, 100.0) << '\t';
os << "0\t"; // obsolete
- os << Curr_.value_str("SepAcctCharges" ,j) << '\t';
+ os << Curr_.value_str("SepAcctCharges" ,j, 100.0) << '\t';
os << Curr_.value_str("AnnSAIntRate" ,j) << '\t';
os << Curr_.value_str("AnnGAIntRate" ,j) << '\t';
- os << Curr_.value_str("GrossIntCredited" ,j) << '\t';
- os << Curr_.value_str("NetIntCredited" ,j) << '\t';
+ os << Curr_.value_str("GrossIntCredited" ,j, 100.0) << '\t';
+ os << Curr_.value_str("NetIntCredited" ,j, 100.0) << '\t';
- os << Guar_.value_str("AcctVal" ,j) << '\t';
- os << Guar_.value_str("CSVNet" ,j) << '\t';
- os << Guar_.value_str("EOYDeathBft" ,j) << '\t';
- os << Curr_.value_str("AcctVal" ,j) << '\t';
- os << Curr_.value_str("CSVNet" ,j) << '\t';
- os << Curr_.value_str("EOYDeathBft" ,j) << '\t';
+ os << Guar_.value_str("AcctVal" ,j, 100.0) << '\t';
+ os << Guar_.value_str("CSVNet" ,j, 100.0) << '\t';
+ os << Guar_.value_str("EOYDeathBft" ,j, 100.0) << '\t';
+ os << Curr_.value_str("AcctVal" ,j, 100.0) << '\t';
+ os << Curr_.value_str("CSVNet" ,j, 100.0) << '\t';
+ os << Curr_.value_str("EOYDeathBft" ,j, 100.0) << '\t';
if(Invar.IsInforce)
{
@@ -748,15 +748,15 @@ void PrintRosterTabDelimited
<< Invar.value_str("UWClass" ) << '\t'
<< Invar.value_str("Smoker" ) << '\t'
<< Invar.value_str("Salary" ,d) << '\t'
- << Invar.value_str("SpecAmt" ,d) << '\t'
- << Invar.value_str("TermSpecAmt" ,d) << '\t'
- << Invar.value_str("InitTgtPrem" ) << '\t'
- << Invar.value_str("ModalMinimumPremium" ,d) << '\t'
- << Invar.value_str("EeModalMinimumPremium",d) << '\t'
- << Invar.value_str("ErModalMinimumPremium",d) << '\t'
- << Invar.value_str("ListBillPremium" ) << '\t'
- << Invar.value_str("EeListBillPremium" ) << '\t'
- << Invar.value_str("ErListBillPremium" ) << '\t'
+ << Invar.value_str("SpecAmt" ,d, 100.0) << '\t'
+ << Invar.value_str("TermSpecAmt" ,d, 100.0) << '\t'
+ << Invar.value_str("InitTgtPrem" , 100.0) << '\t'
+ << Invar.value_str("ModalMinimumPremium" ,d, 100.0) << '\t'
+ << Invar.value_str("EeModalMinimumPremium",d, 100.0) << '\t'
+ << Invar.value_str("ErModalMinimumPremium",d, 100.0) << '\t'
+ << Invar.value_str("ListBillPremium" , 100.0) << '\t'
+ << Invar.value_str("EeListBillPremium" , 100.0) << '\t'
+ << Invar.value_str("ErListBillPremium" , 100.0) << '\t'
<< "'" << Invar.ListBillDate << "'\t"
<< Invar.EeMode [d] << '\t'
<< Invar.ErMode [d] << '\t'
@@ -1032,19 +1032,19 @@ void FlatTextLedgerPrinter::PrintNumericalSummary()
const
os_.precision(2);
- os_ << std::setw(12) << invar().Outlay [row];
+ os_ << std::setw(12) << invar().Outlay [row] / 100.0;
- os_ << std::setw(12) << guar_().AcctVal [row];
- os_ << std::setw(12) << guar_().CSVNet [row];
- os_ << std::setw(12) << guar_().EOYDeathBft[row];
+ os_ << std::setw(12) << guar_().AcctVal [row] / 100.0;
+ os_ << std::setw(12) << guar_().CSVNet [row] / 100.0;
+ os_ << std::setw(12) << guar_().EOYDeathBft[row] / 100.0;
- os_ << std::setw(12) << mdpt_().AcctVal [row];
- os_ << std::setw(12) << mdpt_().CSVNet [row];
- os_ << std::setw(12) << mdpt_().EOYDeathBft[row];
+ os_ << std::setw(12) << mdpt_().AcctVal [row] / 100.0;
+ os_ << std::setw(12) << mdpt_().CSVNet [row] / 100.0;
+ os_ << std::setw(12) << mdpt_().EOYDeathBft[row] / 100.0;
- os_ << std::setw(12) << curr_().AcctVal [row];
- os_ << std::setw(12) << curr_().CSVNet [row];
- os_ << std::setw(12) << curr_().EOYDeathBft[row];
+ os_ << std::setw(12) << curr_().AcctVal [row] / 100.0;
+ os_ << std::setw(12) << curr_().CSVNet [row] / 100.0;
+ os_ << std::setw(12) << curr_().EOYDeathBft[row] / 100.0;
os_ << endrow;
}
@@ -1127,15 +1127,15 @@ void FlatTextLedgerPrinter::PrintTabularDetail() const
os_.precision(2);
- os_ << std::setw(12) << invar().Outlay [j];
+ os_ << std::setw(12) << invar().Outlay [j] / 100.0;
- os_ << std::setw(12) << guar_().AcctVal [j];
- os_ << std::setw(12) << guar_().CSVNet [j];
- os_ << std::setw(12) << guar_().EOYDeathBft[j];
+ os_ << std::setw(12) << guar_().AcctVal [j] / 100.0;
+ os_ << std::setw(12) << guar_().CSVNet [j] / 100.0;
+ os_ << std::setw(12) << guar_().EOYDeathBft[j] / 100.0;
- os_ << std::setw(12) << curr_().AcctVal [j];
- os_ << std::setw(12) << curr_().CSVNet [j];
- os_ << std::setw(12) << curr_().EOYDeathBft[j];
+ os_ << std::setw(12) << curr_().AcctVal [j] / 100.0;
+ os_ << std::setw(12) << curr_().CSVNet [j] / 100.0;
+ os_ << std::setw(12) << curr_().EOYDeathBft[j] / 100.0;
os_ << endrow;
}
diff --git a/main_cli.cpp b/main_cli.cpp
index 2f924ee1..2c5fa755 100644
--- a/main_cli.cpp
+++ b/main_cli.cpp
@@ -91,7 +91,7 @@ void self_test()
expected_value = 6305652.52;
z("CLI_selftest", naic_no_solve);
- observed_value = z.principal_ledger()->GetCurrFull().AcctVal.back();
+ observed_value = z.principal_ledger()->GetCurrFull().AcctVal.back() /
100.0;
if(!antediluvian && .005 < std::fabs(expected_value - observed_value))
{
warning()
@@ -108,7 +108,7 @@ void self_test()
naic_solve_specamt["SolveType"] = "Specified amount";
expected_value = 1879139.14;
z("CLI_selftest", naic_solve_specamt);
- observed_value = z.principal_ledger()->GetCurrFull().AcctVal.back();
+ observed_value = z.principal_ledger()->GetCurrFull().AcctVal.back() /
100.0;
if(!antediluvian && .005 < std::fabs(expected_value - observed_value))
{
warning()
@@ -125,7 +125,7 @@ void self_test()
naic_solve_ee_prem["SolveType"] = "Employee premium";
expected_value = 10673.51;
z("CLI_selftest", naic_solve_ee_prem);
- observed_value =
z.principal_ledger()->GetLedgerInvariant().EeGrossPmt.front();
+ observed_value =
z.principal_ledger()->GetLedgerInvariant().EeGrossPmt.front() / 100.0;
if(!antediluvian && .005 < std::fabs(expected_value - observed_value))
{
warning()
diff --git a/solve.cpp b/solve.cpp
index 80fcb8fa..7b08a246 100644
--- a/solve.cpp
+++ b/solve.cpp
@@ -91,15 +91,15 @@ currency SolveTest()
Negative = std::min
(Negative
// CURRENCY !! Cents in ledger will make rounding unnecessary.
- ,round_to_cents.c(ConstThat->VariantValues().CSVNet[j])
+ ,round_to_cents.c(ConstThat->VariantValues().CSVNet[j] / 100.0)
// Ideally, it'd be this:
-// ,std::min(ConstThat->VariantValues().CSVNet[j],
ConstThat->loan_ullage_[j])
+// ,std::min(ConstThat->VariantValues().CSVNet[j] / 100.0,
ConstThat->loan_ullage_[j])
// but the antediluvian branch doesn't calculate ullage at all.
);
}
// CURRENCY !! Cents in ledger will make rounding unnecessary.
- currency z =
round_to_cents.c(ConstThat->VariantValues().CSVNet[ThatSolveTgtYear - 1]);
+ currency z =
round_to_cents.c(ConstThat->VariantValues().CSVNet[ThatSolveTgtYear - 1] /
100.0);
if(Negative < C0)
z = std::min(z, Negative);
// IHS !! If SolveTgtYr within no-lapse period...see lmi.
- [lmi-commits] [lmi] master 8ea7412a 01/27: Allow "touchstone" files to contain '\t', (continued)
- [lmi-commits] [lmi] master 8ea7412a 01/27: Allow "touchstone" files to contain '\t', Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master 20297761 05/27: Add a new ledger emission option, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master d4083917 07/27: Test eleven farraginous files nychthemerally, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master d195c7af 10/27: Add a unit test for ledger_format(), Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master 3064fee4 09/27: Add a helper function with a deliberately ugly name, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master 37b663fe 11/27: Add an option to format cents as decimal dollars, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master 550db6d9 15/27: Record speed measurements, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master a7d075cd 16/27: Document, suppress, or expunge unused formats, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master fdb47029 08/27: Fix dblize()ation in commented-out code, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master 174198af 12/27: Reformat, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master dcbe9418 14/27: Change currency fields in ledger to integral cents,
Greg Chicares <=
- [lmi-commits] [lmi] master af0666c3 24/27: Distinguish two ledger formats, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master 7b30e2d8 03/27: Filter unexpectedly small system-test discrepancies, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master d7ab80c6 04/27: Clean up beforehand, not afterward, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master 12192723 06/27: Add two new ledger emission options, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master 119df7a9 13/27: Add a 'divisor' argument to LedgerBase::value_str(), Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master 2b108ed7 18/27: Avoid unnecessary rounding, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master b7c61b4d 20/27: Regularize format names, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master 8de190ce 17/27: Regularize whitespace, Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master 0b6a3b69 02/27: Avoid writing " \n", Greg Chicares, 2022/04/25
- [lmi-commits] [lmi] master 95b4e917 19/27: Remove an unnecessary comment, Greg Chicares, 2022/04/25