mirror of
https://github.com/betagouv/mon-entreprise
synced 2025-02-10 01:05:02 +00:00
La fonction `uniroot` prend 2 paramètres d'amorçage "min" et "max" qui nous définissions jusqu'alors comme des minimums et maximum absolus -10^8 et +10^8. Vu que nous sommes obligés de calculer au moins une première valeur à l'extérieur de `uniroot` notamment pour calculer les variables manquantes, ce commit permet de ré-utiliser ce calcul dans l'amorçage d' `uniroot`. Les gains de performances sont détaillés dans la PR associée. Par ailleurs supprime l'option "valeurs négatives possibles" rendue obsolète. Il y a des légers décalages d'1€ sur une dizaine de snapshots qui liés à des arrondis à l'euro. On calcule en effet les inversions à 10 centimes près et on peut donc tomber sur une valeur de xx,54€ là où la vraie valeur est xx,48€ ce qui donne 1€ de différence avec l'arrondi alors que la différence initialement calculée est inférieure à 10 centimes. Par curiosité j'ai rejoué les tests de non-régressions en changeant les paramètres d'`uniroot` pour avoir une précision au centime près (en augmentant le nombre max d'itération à 50) et il se trouve que sur la dizaine de tests différents entre ce commit et la version d'avant une moitié des arrondis à l'euro étaient faux avant et corrects maintenant et inversement pour l'autre moitié.
33 lines
768 B
TypeScript
33 lines
768 B
TypeScript
import { mapTemporal } from './temporal'
|
|
import { convertUnit, simplifyUnit } from './units'
|
|
import { EvaluatedNode, Unit } from './types'
|
|
|
|
export function simplifyNodeUnit(node) {
|
|
if (!node.unit) {
|
|
return node
|
|
}
|
|
const unit = simplifyUnit(node.unit)
|
|
|
|
return convertNodeToUnit(unit, node)
|
|
}
|
|
|
|
export function convertNodeToUnit<Names extends string>(
|
|
to: Unit | undefined,
|
|
node: EvaluatedNode<Names, number>
|
|
) {
|
|
const temporalValue =
|
|
node.temporalValue && node.unit
|
|
? mapTemporal(
|
|
value => convertUnit(node.unit, to, value),
|
|
node.temporalValue
|
|
)
|
|
: node.temporalValue
|
|
return {
|
|
...node,
|
|
nodeValue: node.unit
|
|
? convertUnit(node.unit, to, node.nodeValue)
|
|
: node.nodeValue,
|
|
...(temporalValue && { temporalValue }),
|
|
unit: to
|
|
}
|
|
}
|