Search code examples
javaprecisionbigdecimal

Using Java BigDecimal for a 15 precision digit (scale of 2)


I found a partial answer here, but I knew this already. So I decided to post a new question.

I am trying to convert a HTTP request parameter string to a 15 precision Java BigDecimal number (with scaling of 2). For example,

String x = request.getParameter("seqNo"); /* e.g. 12345678910111213141516.17181920 whatever */
// I want to convert x so that it has a precision of 15 and scale of 2 i.e. 111213141516.17.

I don't care about rounding. It's a form of reference number, so irrelevant of rounding. I know that scaling can be set by using overloaded setScale(int) method that will return a scaled(Truncated?) BigDecimal. But how to make sure that the precision is set properly?


Solution

  • How about using substring instead? It's not really a number anyway.

    int pos = x.indexOf('.');
    String y = x.substring(pos - 12, pos + 3);
    

    If you are really crazy enough to try processing this as numbers (collissions and differences in rounding are going to break your neck sooner or later!), you could do this.

    double v = Double.parseDouble(y); // REALLY REALLY REALLY NOT RECOMMENDED.
    

    But this is a very very bad idea. Don't squeeze something into a number column that is not a number. Next week, you'll get numbers with two dots, and it will break in every possible way.

    If you do not need to do mathematical computations, treating such a field as VARCHAR or TEXT is perfectly acceptable. Because that is what it is: a sequence of characters. Not a number.

    In fact, I would strongly advise to store the whole number, as VARCHAR. It is a unique identifier, not a mathematical number to do computations with.