テンプレートに次のコードがあります。
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位で四捨五入されません。テンプレートエラーなどは発生せずに実行されますが、誤った出力が生成されます。私の理解 ドキュメントから 、さらに 関連するスタックオーバーフローの質問 でさえ、私のフォーマットは機能するはずです。何が欠けているか、間違っていますか?
フィルター演算子が乗算よりも優先されることに気づかなかった!
バーニーのコメントに続いて、私は切り替えました
{{ deet.value*100|round(1) }}
に
{{ 100*deet.value|round(1) }}
問題を解決しました。処理は他のコードで行われるべきだと私は同意します。
丸めたい値の周りに括弧を付けることができます。 (これは、@ sobriが書いたものとは異なり、除算にも有効です。)
{{ (deet.value/100)|round }}
注:round
はfloat
を返すので、int
が本当に必要な場合は、そのフィルターを介して値も渡す必要があります。
{{ (deet.value/100)|round|int }}
これを試して
{{ (deet.value*100)|round(1) }}
かっこを入れなかった場合、結果は100になります。
私はこれに遭遇しました...ジンジャで必要なint(mem_total/4)。私はそれを2つの操作にすることで解決しました:
{% set LS_HEAP_SIZE = grains['mem_total'] / 4 %}
{% set LS_HEAP_SIZE = LS_HEAP_SIZE | round | int %}
フィルター演算子が優先される場合は、「{{100 * deet.value | round(1)}}」でround(1)ではなくround(3)を使用する必要があります