log4j print float为指数

时间:2013-01-02 07:02:54

标签: java floating-point log4j

我刚刚发现log4j在我的应用程序中将float作为指数(例如:2.2388E2)打印。我希望它将值显示为非指数。 (223.88)

案例发生在客户环境中,我能够模拟。在什么情况下会发生这件事?知道如何防止这种情况吗?

额外信息:信封文档是使用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>

1 个答案:

答案 0 :(得分:1)

您正在记录字符串余额,因此它不可能是log4j的错误:

logger.error(String.valueOf(accountStaticBalance))

现在String.valueOf()不是很灵活,你会想要使用其他东西,比如NumberFormat(或DecimalFormat)。以下是Float.toString()official rules的摘录,与String.valueOf(float)相同:

  • 如果m大于或等于10 ^ -3但小于10 ^ 7,那么它表示为m的整数部分,以十进制形式表示,没有前导零,后跟'。' ('\ u002E'),后跟一个或多个十进制数字,表示m的小数部分。
  • 如果m小于10 ^ -3或大于或等于10 ^ 7,则它以所谓的“计算机化科学记数法”表示。设n是唯一的整数,使得10 ^ n <= m <1。 10 ^ N + 1;然后将a设为m和10 ^ n的数学上精确的商,使得1 <= a <1。 10.然后将幅度表示为a的整数部分,作为单个十进制数字,后跟“。”。 ('\ u002E'),后跟表示a的小数部分的十进制数字,后跟字母'E'('\ u0045'),后跟n表示十进制整数,由Integer方法生成。的toString(INT)。

我不明白为什么这些规则会在不同的环境中产生不同的结果,所以也许你没有显示正确的代码。这些规则甚至不依赖于当前的语言环境。