[ 
https://issues.apache.org/jira/browse/LANG-1018?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Duncan Jones updated LANG-1018:
-------------------------------
    Fix Version/s:     (was: Review Patch)
                   Patch Needed

Sorry, ignore the previous comments (now deleted). I misinterpreted your issue 
entirely.

I see your point now - if {{createDouble(str)}} had been used on your example 
string, the results would be more accurate. Clearly our logic for determining 
when to use the different data types may need improving.

If you have suggestions for a patch, please post one. Otherwise I'll do some 
research to see if things can be improved.

I've changed to "Patch Needed" since there is no patch here to review.

> NumberUtils.createNumber(final String str)  Precision will be lost
> ------------------------------------------------------------------
>
>                 Key: LANG-1018
>                 URL: https://issues.apache.org/jira/browse/LANG-1018
>             Project: Commons Lang
>          Issue Type: Bug
>          Components: lang.math.*
>    Affects Versions: 3.3.2
>         Environment: windows 7
>            Reporter: sydng
>             Fix For: Patch Needed
>
>
> With commons-lang 3.2.2:
> NumberUtils.createNumber("-160952.54");
> The result is "-160952.55".
> Should not be based on the length of the decimal point number to judge 
> whether the floating point number.
> Using the method (createFloat(str)) of dealing with the valid number greater 
> than seven Numbers will cause accuracy loss.
> The source code is as follows:
> {code:java}
> try {
>             if(numDecimals <= 7){// If number has 7 or fewer digits past the 
> decimal point then make it a float
>                 final Float f = createFloat(str);
>                 if (!(f.isInfinite() || (f.floatValue() == 0.0F && 
> !allZeros))) {
>                     return f;
>                 }
>             }
>         } catch (final NumberFormatException nfe) { // NOPMD
>             // ignore the bad number
>         }
>         try {
>             if(numDecimals <= 16){// If number has between 8 and 16 digits 
> past the decimal point then make it a double
>                 final Double d = createDouble(str);
>                 if (!(d.isInfinite() || (d.doubleValue() == 0.0D && 
> !allZeros))) {
>                     return d;
>                 }
>             }
>         } catch (final NumberFormatException nfe) { // NOPMD
>             // ignore the bad number
>         }
>         return createBigDecimal(str);
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to