Use exact decimals for rates, amounts and every money value

Use the decimal type for every rate, spread, notional, amount, price, strike, fee and premium. The domain type is the exact decimal and the column is numeric(38, 12). A double never enters the persisted domain. Convert from decimal to double only at the numerical kernel seam. At the ORE boundary, read the digits the document wrote and write the same digits back. Do not read them through a float. A continuous quantity stays a binary float: a volatility, a correlation, a weight, a probability, a recovery rate or a tranche fraction. Classify each numeric column as money or continuous before you choose its type.

Why: ORE types these values as xs:float. A float holds only the nearest binary value, so a strike of 0.005 was stored and exported as 0.00499999989, and a cap of 0.025 was stored as 0.02500000037252903. The FRA digits fix and the credit analysis both found this.

How to apply: Give each money column in a new model the type numeric(38, 12). In the generated codec table, name the member in the –exact-decimal list of projects/ores.ore/scripts/regenerate_xml_bindings.sh, then regenerate. The table holds the member as an exact decimal. Read it with record_reader::decimal or own_decimal and write it with set_decimal. Add a mapper test that holds the digits. See doc/knowledge/architecture/exact_numbers_and_economic_change.org.

Emacs 29.3 (Org mode 9.6.15)