0

我刚刚发现 log4j 在我的应用程序中将浮点数打印为指数(例如: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>
4

1 回答 1

1

您正在记录一个字符串余额,所以这不可能是 log4j 的错:

logger.error(String.valueOf(accountStaticBalance))

现在 String.valueOf() 不是很灵活,你会想要使用别的东西,比如NumberFormat(或 DecimalFormat)。这是Float.toString()官方规则的摘录,与 String.valueOf (float) 相同:

  • 如果 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 方法生成。到字符串(整数)。

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

于 2013-01-02T07:32:52.900 回答