2013-01-02 123 views
0

我剛剛發現log4j在我的應用程序中打印浮點數爲指數(例如:2.2388E2)。我希望它顯示爲非指數的值。 (223.88)log4j打印浮點數爲指數

這種情況發生在客戶環境中,我可以模擬。在什麼情況下會發生這種事情?任何想法如何防止這一點?

其他信息:信封文檔是使用CXF生成的,如果它確實很重要。

下面是我的單位爲例:

@Test  
public void testSomething() 
{ 

    ServiceEnvelopeDocument serviceEnvelopeDocument =  ServiceEnvelopeDocument.Factory.newInstance(); 
    ServiceEnvelope serviceEnvelope     =  serviceEnvelopeDocument.addNewServiceEnvelope(); 
    ServiceBody serviceBody       =  serviceEnvelope.addNewServiceBody(); 
    RsDetail rsDetails        =  serviceBody.addNewRsDetail(); 

    float testFloat = 223.88f; 

    AuxiliaryAccountStaticBalanceDetail accountStaticBalance = rsDetails.addNewAuxiliaryAccountStaticBalanceDetail(); 

    accountStaticBalance.setAccountBalance(testFloat); 

    logger.error(""+accountStaticBalance); 
    logger.error(serviceEnvelopeDocument.toString()); 
    logger.error(String.valueOf(accountStaticBalance)); 
}` 

輸出上面的源代碼:

2013-01-02 14:55:33.443 ERROR (main) AccountInquiryUtilTest: - <AccountBalance xmlns="http://schemas.ocbc.com/soa/emf/account/elements">223.88</AccountBalance> 
2013-01-02 14:55:33.465 ERROR (main) AccountInquiryUtilTest: - <ServiceEnvelope xmlns="http://schemas.ocbc.com/soa/emf/common/envelope/" xmlns:cbs="http://schemas.ocbc.com/soa/emf/service/CBS-CustAccountInfo-I" xmlns:agg="http://schemas.ocbc.com/soa/emf/account/aggregates" xmlns:elem="http://schemas.ocbc.com/soa/emf/account/elements"> 
    <ServiceBody> 
    <cbs:RsDetail> 
     <agg:HolderAccountTypeDetail/> 
     <agg:AuxiliaryAccountStaticBalanceDetail> 
     <elem:AccountBalance>223.88</elem:AccountBalance> 
     </agg:AuxiliaryAccountStaticBalanceDetail> 
    </cbs:RsDetail> 
    </ServiceBody> 
</ServiceEnvelope> 
2013-01-02 14:55:33.544 ERROR (main) AccountInquiryUtilTest: - <AccountBalance xmlns="http://schemas.ocbc.com/soa/emf/account/elements">223.88</AccountBalance> 

輸出在客戶環境:

<ns3:AccountBalance>2.2388E2</ns3:AccountBalance> 
+0

你可以分享log4j配置嗎? –

回答

1

你登錄一個字符串平衡,所以它不可能是log4j的錯:

logger.error(String.valueOf(accountStaticBalance)) 

現在String.valueOf()不是很靈活,你會想要使用其他的東西,如NumberFormat(或DecimalFormat)。下面是從official rules爲Float.toString(),它是與用於將String.valueOf(浮點)的摘錄:

  • 如果m大於或等於10^-3但小於10^7,則它表示爲m的整數部分,以十進制形式表示,不帶前導零,後跟'。'。 ('\ u002E'),後跟一個或多個小數位,代表m的小數部分。
  • 如果m小於10^-3或大於或等於10^7,則以所謂的「計算機科學記數法」表示。設n是唯一整數,使得10^n < = m < 10^n + 1;那麼令a爲m和10^n的數學精確商,以便1 < = a < 10.然後將幅度表示爲a的整數部分,作爲單個十進制數字,後面跟着'。'。 ('\ u002E'),後跟十進制數字,表示a的小數部分,後跟字母'E'('\ u0045'),後面跟着n表示十進制整數,如方法Integer所產生的。的toString(INT)。

我不明白爲什麼這些規則會在不同的環境中產生不同的結果,所以也許你沒有顯示正確的代碼。這些規則甚至不依賴於當前的語言環境。