2
votes

Comment arrondir, sol, plafond, tronquer

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 commentaires

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


3 Réponses :


0
votes

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
$ 


1 commentaires

Existe-t-il une solution pour la version jq inférieure à 1.6?



1
votes

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.


2 commentaires

jq: error: trunc/0 is not defined at <top-level>, line 1


Si la mise à niveau n'aide pas, voir: stackoverflow.com/questions/56593531/...



4
votes

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.

rond / 0

def trunc: if . < 0 then ceil else floor end;

ceil / 0

def ceil: if . | floor == . then . else . + 1.0 | floor end;

trunc / 0

def round: . + 0.5 | floor;


0 commentaires