lmi-commits
[Top][All Lists]
Advanced

[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>&nbsp;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>&nbsp;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>&nbsp;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>&nbsp;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>&nbsp;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>&nbsp;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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]