2017-03-04 57 views
1

私は、SpringブートMVCとThymeleafを使ってHTMLページをレンダリングするプロジェクトを持っています。ページの一つで、私は、オプションを選択Thymeleaf持つように次のHTMLを持っている: "警告が0.5または0.75と等しいが、警告が0.9または0.95に等しい場合、Thymeleafは追加されない場合Thymeleafのth:selected属性の信頼性の低い動作

<select name="value" 
     id="usersWarning"> 
    <option value="0" th:text="#{button.disabled}">0</option> 
    <option value="0.5" th:selected="${warning} == 0.5">50%</option> 
    <option value="0.75" th:selected="${warning} == 0.75">75%</option> 
    <option value="0.9" th:selected="${warning} == 0.9">90%</option> 
    <option value="0.95" th:selected="${warning} == 0.95">95%</option> 
</select> 

Thymeleafは期待通りに動作します選択された "属性をそのオプションに追加する。

<option th:text="${warning}"></option> 

が、それぞれの場合にThymeleafが0.9または0.95を正しく示しています。私は私の警告値が間違っているかどうかを確認するために、次のオプションを追加しました。

ありがとうございました。これは私に最後の1時間を夢中にさせてくれました。

+0

おそらく浮動小数点比較の丸め誤差のためです。警告の値を2桁に丸めて文字列として比較したり、式でApache Commons Precision.compareTo()を使用できるかどうかを調べることができます。 – Kylos

+1

@Kylosご提案いただきありがとうございます。あなたは正しいですが、私はvalue.compareTo(警告)== 0を代わりに使って修正しました。 –

答えて

1

私は、これはあなたが結果の文字列比較を実行できるように2桁の10進数の文字列として番号をフォーマットする必要があります

${#numbers.formatDecimal(warning, 0, 2) == '0.95'} 

を試してみることをお勧めします。

浮動小数点比較の誤差が非常に小さく、厳密な比較が失敗する可能性があるため、これが必要な場合があります。文字列として書式設定すると、小数点以下の桁数に丸められ、そうでなければ比較が失敗する小さなエラーが取り除かれます。

関連する問題