Comment puis-je arrondir, sol, plafond et tronquer un nombre dans jq jq-1.5-1-a5b5cbe?
Par exemple, avec {"mass": 188.72}
, je veux {"mass": 188}
avec sol, {"mass": 189}
avec ceil et round.
Exemples d'arrondi:
5.52 --> 5 5.50 --> 5 -5.52 --> -5
Exemples tronqués:
5.52 --> 6 5.50 --> 5 or 6 -5.52 --> -6
J'ai trouvé -5 as $n | if $n > 0 then [range($n+0.00000000000001)] else [range(-$n)] end | last
for truncate, mais il est inutilement complexe (et contient probablement des bogues).
3 Réponses :
Dans jq 1.6, vous avez accès aux fonctions rond / plafond / sol
$ echo '{"mass": 188.42}' | jq ' .mass | tostring | split(".") | .[0] ' -r 188
Pour jq 1.5, voici le hack
Rond:
$ echo '{"mass": 188.42}' | jq ' .mass + 0.99999999 | tostring | split(".") | .[0] ' -r 189
Plafond (peut devoir ajouter plus de 9999s pour augmenter la précision):
$ echo '{"mass": 188.42}' | jq ' .mass + 0.5 | tostring | split(".") | .[0] ' -r 188
Sol:
$ echo '{"mass": 188.72}' | jq ' .mass | round ' 189 $ echo '{"mass": 188.72}' | jq ' .mass | ceil ' 189 $ echo '{"mass": 188.72}' | jq ' .mass | floor ' 188 $
Existe-t-il une solution pour la version jq inférieure à 1.6?
Les fonctions mathématiques intégrées de jq sont énumérées dans la section Math du manuel de jq. La version actuelle est à https://stedolan.github.io/jq/manual/ ; les liens vers les versions antérieures sont en haut.
Notez que les deux jq 1.5 et 1.6 ont des fonctions intégrées nommées round
, ceil
, floor
et trunc
: ce sont tous des filtres 0-arity.
Par exemple
[5.52, 5.50, -5.52 ] | map(trunc) #=> [5,5,-5]
Les versions antérieures de jq ont différents ensembles de fonctions mathématiques, par exemple jq 1.4 a floor
mais pas les trois autres.
jq: error: trunc/0 is not defined at <top-level>, line 1
Si la mise à niveau n'aide pas, voir: stackoverflow.com/questions/56593531/...
Certaines versions peuvent manquer de ces fonctions, mais en ce qui me concerne, le floor
est largement disponible; donc, vous pouvez les implémenter en l'utilisant.
def trunc: if . < 0 then ceil else floor end;
def ceil: if . | floor == . then . else . + 1.0 | floor end;
def round: . + 0.5 | floor;
Pourquoi n'utilisez-vous pas les fonctions Math.round, Math.ceil?
@oguzismail jq-1.5-1-a5b5cbe
@Nitheesh De stedolan.github.io/jq/manual/v1.5/#Math : "La disponibilité des fonctions mathématiques standard dépend de la disponibilité des fonctions mathématiques correspondantes dans votre système d'exploitation et dans la bibliothèque mathématique C". En utilisant round, j'obtiens
jq: error: round/0 is not defined at <top-level>, line 1