2011-11-23 27 views
1

我有一個奇怪的問題<f:convertNumber>。當我將maxIntegerDigits設置爲15並輸入16的「1」時,我得到正確的數字和15個「1」,但是如果我輸入20的「1」,則不會得到15個「1」的數字,但是一個11「1」和4「0」的數字,即111111111110000,我輸入的數字越少,數字越少,得到的零點也越多。爲什麼?
這裏的代碼片段:jsf convertNumber的maxIntegerDigits

<a4j:region> 
    <h:inputText id="numValue" value="#{MyBean.valueN}"> 
     <a4j:support event="onchange" limitToList="true" ajaxSingle="true" reRender="numValue"/> 
     <f:convertNumber groupingUsed="false" type="number" maxIntegerDigits="15" minFractionDigits="0"/> 
    </h:inputText> 
</a4j:region> 

MyBean.valueN爲java.lang.Double的值。

回答

2

這就是IEEE 754浮點數的本質。具有該整數精度的最大值a double可以保持爲1.7976931348623157e308。超出此整數精度的任何內容都將被舍入。

您想改爲使用java.math.BigDecimal。這樣您的<f:convertNumber>將以滿意的方式工作。

+0

它沒有幫助。 BigDecimal允許我輸入更多的數字(最多19位,而字段限制爲21個符號,其中只有15個符號可以是整數部分),但是它再次以某種奇怪的方式轉換我的號碼。 20「1」被轉換爲111111111110656.所以我決定只檢查最大允許的數字而不是丟掉多餘的數字。這樣它就可以正常工作,而且它看起來更加正確。 :)雖然我仍然不明白爲什麼maxIntegerDigits即使使用BigDecimal也無法正常工作。 – mykola