Merge pull request #256 from CatalaLang/fix_money_rounding

Fix money parsing
This commit is contained in:
Denis Merigoux 2022-05-06 11:28:40 +02:00 committed by GitHub
commit 274d0a15e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 43 additions and 25 deletions

View File

@ -567,6 +567,9 @@ let rec lex_code (lexbuf : lexbuf) : token =
| MC_DECIMAL_SEPARATOR -> buf := cents
| _ -> ()
done;
(* If the user has written $0.3 it means 30 cents so we have to pad
with a 0 *)
Buffer.add_string cents (String.make (2 - Buffer.length cents) '0');
L.update_acc lexbuf;
MONEY_AMOUNT (Buffer.contents units, Buffer.contents cents)
| Plus digit, MC_DECIMAL_SEPARATOR, Star digit ->

View File

@ -58,7 +58,7 @@ champ d'application Test1:
définition f.i_date_courante égal à |2020-05-01|
définition f.i_résidence égal à Métropole
règle f.i_personne_charge_effective_permanente_est_parent rempli
assertion f.i_montant_versé = 351,26
assertion f.i_montant_versé = 351,54
déclaration champ d'application Test2:
f champ d'application InterfaceAllocationsFamiliales
@ -71,7 +71,7 @@ champ d'application Test2:
définition f.i_date_courante égal à |2020-05-01|
définition f.i_résidence égal à Métropole
règle f.i_personne_charge_effective_permanente_est_parent rempli
assertion f.i_montant_versé = 216,27
assertion f.i_montant_versé = 216,46
déclaration champ d'application Test3:
@ -84,7 +84,7 @@ champ d'application Test3:
définition f.i_date_courante égal à |2020-05-01|
définition f.i_résidence égal à Guyane
règle f.i_personne_charge_effective_permanente_est_parent rempli
assertion f.i_montant_versé = 24,35
assertion f.i_montant_versé = 24,37
déclaration champ d'application Test4:
f champ d'application InterfaceAllocationsFamiliales
@ -96,7 +96,7 @@ champ d'application Test4:
définition f.i_date_courante égal à |2020-05-01|
définition f.i_résidence égal à Métropole
règle f.i_personne_charge_effective_permanente_est_parent rempli
assertion f.i_montant_versé = 99,37
assertion f.i_montant_versé = 99,46
déclaration champ d'application Test5:
f champ d'application InterfaceAllocationsFamiliales
@ -131,7 +131,7 @@ champ d'application Test6:
définition f.i_date_courante égal à |2020-05-01|
définition f.i_résidence égal à Guadeloupe
règle f.i_personne_charge_effective_permanente_est_parent rempli
assertion f.i_montant_versé = 66,25
assertion f.i_montant_versé = 66,30
déclaration champ d'application Test7:
f champ d'application InterfaceAllocationsFamiliales
@ -144,7 +144,7 @@ champ d'application Test7:
définition f.i_date_courante égal à |2021-02-01|
définition f.i_résidence égal à Métropole
règle f.i_personne_charge_effective_permanente_est_parent rempli
assertion f.i_montant_versé = 417,51
assertion f.i_montant_versé = 417,84
déclaration champ d'application Test8:
f champ d'application InterfaceAllocationsFamiliales
@ -167,7 +167,7 @@ champ d'application Test8:
définition f.i_date_courante égal à |2021-01-01|
définition f.i_résidence égal à Métropole
règle f.i_personne_charge_effective_permanente_est_parent rempli
assertion f.i_montant_versé = 197,74
assertion f.i_montant_versé = 197,90
déclaration champ d'application Test9:
f champ d'application InterfaceAllocationsFamiliales
@ -213,7 +213,7 @@ champ d'application Test10:
définition f.i_date_courante égal à |2020-04-20|
définition f.i_résidence égal à Métropole
règle f.i_personne_charge_effective_permanente_est_parent rempli
assertion f.i_montant_versé = 99,37
assertion f.i_montant_versé = 99,46
déclaration champ d'application Test11:
f champ d'application InterfaceAllocationsFamiliales

File diff suppressed because one or more lines are too long

View File

@ -635,7 +635,7 @@ let prestations_familiales
}
(date_courante_ >=@ date_of_numbers 2020 4 1
&& date_courante_ <@ date_of_numbers 2021 4 1)
then money_of_cents_string "41404"
then money_of_cents_string "41440"
else raise EmptyError);
(fun (_ : _) ->
if
@ -2380,7 +2380,7 @@ let allocations_familiales
>! integer_of_string "2"
then
prestations_familiales_dot_base_mensuelle_
*$ decimal_of_string "0.075"
*$ decimal_of_string "0.0615"
else money_of_cents_string "0"
else raise EmptyError);
(fun (_ : _) ->
@ -2561,7 +2561,7 @@ let allocations_familiales
>! integer_of_string "1"
then
prestations_familiales_dot_base_mensuelle_
*$ decimal_of_string "0.284"
*$ decimal_of_string "0.2804"
else money_of_cents_string "0"
else raise EmptyError);
(fun (_ : _) ->
@ -2621,7 +2621,7 @@ let allocations_familiales
>! integer_of_string "1"
then
prestations_familiales_dot_base_mensuelle_
*$ decimal_of_string "0.273"
*$ decimal_of_string "0.2613"
else money_of_cents_string "0"
else raise EmptyError);
(fun (_ : _) ->
@ -2951,7 +2951,7 @@ let allocations_familiales
>! integer_of_string "0"
then
prestations_familiales_dot_base_mensuelle_
*$ decimal_of_string "0.115"
*$ decimal_of_string "0.1105"
else money_of_cents_string "0"
else raise EmptyError);
(fun (_ : _) ->
@ -3649,7 +3649,7 @@ let allocations_familiales
(ressources_menage_ >$ plafond__i_i_d521_3_)
then
prestations_familiales_dot_base_mensuelle_
*$ decimal_of_string "0.0559"
*$ decimal_of_string "0.05059"
else raise EmptyError);
(fun (_ : _) ->
if
@ -3675,7 +3675,7 @@ let allocations_familiales
&& ressources_menage_ <=$ plafond__i_i_d521_3_)
then
prestations_familiales_dot_base_mensuelle_
*$ decimal_of_string "0.1117"
*$ decimal_of_string "0.10117"
else raise EmptyError);
(fun (_ : _) ->
if

View File

@ -33,12 +33,12 @@ def call_allocations_familiales() -> float:
def benchmark_iteration():
money_given = call_allocations_familiales()
assert (money_given == 99.37)
assert (money_given == 99.46)
def run_with_log() -> List[LogEvent]:
money_given = call_allocations_familiales()
assert (money_given == 99.37)
assert (money_given == 99.46)
log = retrieve_log()
reset_log()
return log

View File

@ -709,7 +709,7 @@ def prestations_familiales(prestations_familiales_in: PrestationsFamilialesIn):
"Décrets divers"]), ((date_courante_1 >=
date_of_numbers(2020, 4, 1)) and (date_courante_1 <
date_of_numbers(2021, 4, 1)))):
return money_of_cents_string("41404")
return money_of_cents_string("41440")
else:
raise EmptyError
@ -1822,7 +1822,7 @@ def allocations_familiales(allocations_familiales_in: AllocationsFamilialesIn):
if (list_length(enfants_a_charge_droit_ouvert_prestation_familiale) >
integer_of_string("2")):
return (prestations_familiales_dot_base_mensuelle *
decimal_of_string("0.075"))
decimal_of_string("0.0615"))
else:
return money_of_cents_string("0")
else:
@ -2088,7 +2088,7 @@ def allocations_familiales(allocations_familiales_in: AllocationsFamilialesIn):
if (list_length(enfants_a_charge_droit_ouvert_prestation_familiale) >
integer_of_string("1")):
return (prestations_familiales_dot_base_mensuelle *
decimal_of_string("0.273"))
decimal_of_string("0.2613"))
else:
return money_of_cents_string("0")
else:
@ -2124,7 +2124,7 @@ def allocations_familiales(allocations_familiales_in: AllocationsFamilialesIn):
if (list_length(enfants_a_charge_droit_ouvert_prestation_familiale) >
integer_of_string("1")):
return (prestations_familiales_dot_base_mensuelle *
decimal_of_string("0.284"))
decimal_of_string("0.2804"))
else:
return money_of_cents_string("0")
else:
@ -2325,7 +2325,7 @@ def allocations_familiales(allocations_familiales_in: AllocationsFamilialesIn):
if (list_length(enfants_a_charge_droit_ouvert_prestation_familiale) >
integer_of_string("0")):
return (prestations_familiales_dot_base_mensuelle *
decimal_of_string("0.115"))
decimal_of_string("0.1105"))
else:
return money_of_cents_string("0")
else:
@ -2731,7 +2731,7 @@ def allocations_familiales(allocations_familiales_in: AllocationsFamilialesIn):
plafond__i_d521_3) and (ressources_menage <=
plafond__i_i_d521_3))):
return (prestations_familiales_dot_base_mensuelle *
decimal_of_string("0.1117"))
decimal_of_string("0.10117"))
else:
raise EmptyError
@ -2746,7 +2746,7 @@ def allocations_familiales(allocations_familiales_in: AllocationsFamilialesIn):
"Code de la sécurité sociale"]), (ressources_menage >
plafond__i_i_d521_3)):
return (prestations_familiales_dot_base_mensuelle *
decimal_of_string("0.0559"))
decimal_of_string("0.05059"))
else:
raise EmptyError
temp_montant_verse_forfaitaire_par_enfant_5 = handle_default(

View File

@ -0,0 +1,12 @@
## Article
```catala
declaration scope A:
output x content money
output y content money
scope A:
definition x equals $0.15 *$ 2.0
definition y equals $0.3
assertion x = y
```

View File

@ -0,0 +1,3 @@
[RESULT] Computation successful! Results:
[RESULT] x = $0.30
[RESULT] y = $0.30