"""Original bounded numeric examples, no prices/invoices/legal rounding rule."""
from decimal import Decimal,localcontext,FloatOperation,ROUND_HALF_EVEN,ROUND_HALF_UP,Inexact
from fractions import Fraction
import json,platform
def finite_decimal(s):
 if type(s)is not str or len(s)>32:raise ValueError('bounded string')
 d=Decimal(s)
 if not d.is_finite()or d.copy_abs()>Decimal('1000000'):raise ValueError('finite local range')
 return d
def demo():
 from_string=Decimal('0.1');from_float=Decimal(0.1)
 assert Fraction(from_string)==Fraction(1,10)and Fraction(from_float)==Fraction.from_float(0.1)and from_float!=from_string
 with localcontext()as c:
  c.traps[FloatOperation]=True
  try:Decimal(0.1)
  except FloatOperation:trapped=True
  else:raise AssertionError('float not trapped')
 with localcontext()as c:
  c.prec=3;constructed=Decimal('1.234567');added=constructed+Decimal(0);third=Decimal(1)/Decimal(3)
  assert str(constructed)=='1.234567'and str(added)=='1.23'and str(third)=='0.333'
 rounded=[]
 for s in ['2.345','2.355','-2.345']:
  d=finite_decimal(s);even=d.quantize(Decimal('0.01'),rounding=ROUND_HALF_EVEN);up=d.quantize(Decimal('0.01'),rounding=ROUND_HALF_UP);rounded.append({'input':s,'half_even':str(even),'half_up':str(up)})
 assert rounded==[{'input':'2.345','half_even':'2.34','half_up':'2.35'},{'input':'2.355','half_even':'2.36','half_up':'2.36'},{'input':'-2.345','half_even':'-2.34','half_up':'-2.35'}]
 with localcontext()as c:
  c.prec=28;values=[Decimal('0.005')]*3;end=sum(values).quantize(Decimal('0.01'),rounding=ROUND_HALF_UP);each=sum(v.quantize(Decimal('0.01'),rounding=ROUND_HALF_UP)for v in values)
  assert str(end)=='0.02'and str(each)=='0.03'
 assert len('1000000.000000000000000000000001')==32 and len('-1000000.00000000000000000000001')==32
 rejected=[]
 for s in ['NaN','Infinity','-Infinity','1000001','1000000.000000000000000000000001','-1000000.00000000000000000000001']:
  try:finite_decimal(s)
  except ValueError:rejected.append(s)
  else:raise AssertionError(s)
 return {'python':platform.python_version(),'decimal_from_original_string':str(from_string),'decimal_from_existing_float':str(from_float),'float_fraction':str(Fraction.from_float(0.1)),'float_operation_trapped':trapped,'precision_three':{'constructor':str(constructed),'arithmetic_plus_zero':str(added),'one_third':str(third)},'rounding_examples':rounded,'quantize_after_sum':str(end),'sum_after_each_quantize':str(each),'rejected_cases':rejected,'real_money_or_legal_rule_claimed':False,'all_assertions_passed':True}
if __name__=='__main__':print(json.dumps(demo(),indent=2))
