web-dev-qa-db-ja.com

Jinja2丸めフィルターが丸めない

テンプレートに次のコードがあります。

data: [{% for deet in deets %} {{ deet.value*100|round(1) }}{% if not loop.last %},{% endif %} {% endfor %}]

データが小数点第1位で四捨五入されることを期待しています。ただし、ページまたはソースを表示すると、次のような出力が表示されます。

data: [ 44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818 ]

これは小数点第1位で四捨五入されません。テンプレートエラーなどは発生せずに実行されますが、誤った出力が生成されます。私の理解 ドキュメントから 、さらに 関連するスタックオーバーフローの質問 でさえ、私のフォーマットは機能するはずです。何が欠けているか、間違っていますか?

20
Mittenchops

フィルター演算子が乗算よりも優先されることに気づかなかった!

バーニーのコメントに続いて、私は切り替えました

{{ deet.value*100|round(1) }}

{{ 100*deet.value|round(1) }}

問題を解決しました。処理は他のコードで行われるべきだと私は同意します。

22
Mittenchops

丸めたい値の周りに括弧を付けることができます。 (これは、@ sobriが書いたものとは異なり、除算にも有効です。)

{{ (deet.value/100)|round }}

注:roundfloatを返すので、intが本当に必要な場合は、そのフィルターを介して値も渡す必要があります。

{{ (deet.value/100)|round|int }}
29
John R

これを試して

{{ (deet.value*100)|round(1) }}

かっこを入れなかった場合、結果は100になります。

2
Dithon

私はこれに遭遇しました...ジンジャで必要なint(mem_total/4)。私はそれを2つの操作にすることで解決しました:

{% set LS_HEAP_SIZE = grains['mem_total'] / 4 %}
{% set LS_HEAP_SIZE = LS_HEAP_SIZE | round | int %}
2
Dan Garthwaite

フィルター演算子が優先される場合は、「{{100 * deet.value | round(1)}}」でround(1)ではなくround(3)を使用する必要があります

1
Denis Shulyaka