mirror of
https://github.com/CatalaLang/catala.git
synced 2024-11-08 07:51:43 +03:00
Merge pull request #256 from CatalaLang/fix_money_rounding
Fix money parsing
This commit is contained in:
commit
274d0a15e8
@ -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 ->
|
||||
|
@ -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
|
||||
|
2
french_law/js/french_law.js
generated
2
french_law/js/french_law.js
generated
File diff suppressed because one or more lines are too long
@ -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
|
||||
|
@ -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
|
||||
|
14
french_law/python/src/allocations_familiales.py
generated
14
french_law/python/src/allocations_familiales.py
generated
@ -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(
|
||||
|
12
tests/test_money/good/literal_parsing.catala_en
Normal file
12
tests/test_money/good/literal_parsing.catala_en
Normal 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
|
||||
```
|
@ -0,0 +1,3 @@
|
||||
[RESULT] Computation successful! Results:
|
||||
[RESULT] x = $0.30
|
||||
[RESULT] y = $0.30
|
Loading…
Reference in New Issue
Block a user