Comment gérer les erreurs d'arrondi<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai ce script qui fait un calcul simple et affiche le résultat dans une fenêtre :
sous-total = 100.05 ;
pourcentage de remise = 0,1 ;
discountAmount = sous-total * discountPercent ;
totalBeforeTax = sous-total - remiseAmount ;
message formaté = Concat (
"Total:" , Répéter ( " " , 5 ), Format (total, "Monnaie" ), "\!n" ,
"Pourcentage de remise :" , Répéter ( " " , 5 ), Format (pourcentage de remise, "Pour cent" ), "\!n" ,
"Montant de la remise :" , Répéter ( " " , 5 ), Format (montant de la remise, "Monnaie" ), "\!n" ,
"Total hors taxe:" , Répéter ( " " , 5 ), Format (total hors taxe, "Monnaie" ), "\!n"
);
formattedMessageDisplay = Nouvelle fenetre ( "Résultat" ,
Boîte de programmation ( Col N ( 1 ), Espacement( 0 , 0 ), Boîte à bordure ( Gauche ( 20 ), Droite ( 20 ), haut( 20 ), bas( 20 ),
Zone de texte ( Message formaté, << Définir la taille de la police ( 14 ) ) )
),
Montrer (sous-total, discountAmount, totalBeforeTax)
);
Il produit ce qui suit, dans le journal et la fenêtre de sortie :



Donc en utilisant Format (total hors taxe, "Monnaie" ), résultats in totalBeforeTax étant "arrondi". Je peux penser à une variété de façons de gérer cela, mais je me demandais ce qui serait le plus recommandé.
Re : Comment gérer les erreurs d'arrondiAucun plan Big Number pour le moment.Il y avait beaucoup de points intéressants dans le lien StackOverflow.Différentes solutions peuvent être appropriées en fonction de ce que vous ferez avec les chiffres.
Craig
Re : Comment gérer les erreurs d'arrondiUne autre chose à laquelle j'ai pensé était de convertir en chaîne et d'utiliser Regex.
Re : Comment gérer les erreurs d'arrondiMerci Craige, en effet j'ai envisagé de créer une interface pour permettre à JMP d'accéder à la classe BigDecimal de Java. Est-il prévu d'inclure ce type en tant que type dans la prochaine version de JMP ?
Re : Comment gérer les erreurs d'arrondiVous voudrez peut-être arrondir/plancher/plafond le calcul discountAmount.Round a un deuxième argument que vous pouvez définir sur 2 pour les chiffres après la virgule.Le sol et le plafond auront besoin de quelque chose comme floor(x*100)/100 pour obtenir un résultat similaire.
sous-total = 100,05 ;
remisePourcent = 0,1 ;
remiseMontant = rond (sous-total * réductionPourcentage, 2) ;
totalBeforeTax = sous-total - remiseAmount ;
show(discountAmount, totalBeforeTax);
remiseMontant = 10,01 ;
totalAvantTaxe = 90,04 ;
La fonction de format dans votre code d'origine est sur le point d'arrondir vers le haut ou vers le bas avec le 0,005 arrondi à deux chiffres.L'écart dans la présentation est déclenché par la valeur ayant un moins dans un cas et un plus dans l'autre... les deux valeurs sont arrondies, mais l'une d'elles a un discountAmount négatif dans le calcul.
Les nombres à virgule flottante utilisés dans JMP représentent des nombres tels que 0,01 sous la forme d'une fraction binaire répétitive tronquée.Tout comme 1/3 n'est pas exactement 0,333333333333, la représentation interne n'est pas exacte (sauf pour les fractions binaires comme 1/2, 1/4, 1/8, ...). si vous additionnez 100 centimes, représentés par 0,01, vous obtiendrez un nombre très proche de 1,00, mais différent à la 16ème décimale.Cette toute petite erreur a toujours fait choisir une autre représentation des logiciels comptables : java - Pourquoi ne pas utiliser Double ou Float pour représenter la devise ? - Débordement de pile
totale = 0 ;
Pour( je = 1, je <= 100, je++, total += .01 );
show( format(total,"fixe",20,16) );
Format(total, "fixe", 20, 16) = "1.0000000000000007" ;
Re : Comment gérer les erreurs d'arrondiSalut Jim,
Merci pour votre réponse. Ainsi, Floor et Ceiling arrondissent à l'entier le plus proche. Le format (x, "Devise") semble essentiellement utiliser Round(x,2). On pourrait penser que le format "Devise" utiliserait une méthode de troncature plutôt que d'arrondi.
Re : Comment gérer les erreurs d'arrondiJe ne fais pas beaucoup de rapports financiers, cependant, lorsque je dois m'inquiéter des erreurs d'arrondi, j'utilise simplement les fonctions Round(),Ceiling() et Floor().