This discussion is archived
6 Replies Latest reply: Aug 23, 2011 9:56 AM by 796440 RSS

Double to string giving extra values

883999 Newbie
Currently Being Moderated
hi all,

i have encountered a issue in java and the issue is --

if my decimal no is 0.001 to 0.009 and when i am converting double to string

it is giving string as 0.0010 to 0.0090

the following code is what i am trying to do

double d1 = 0.006;
System.out.println("d===>"+ d1);
String temp1= String.valueOf(d1);
System.out.println("temp1===>"+ temp1);

if(temp1.indexOf(".")!=-1 && (temp1.substring(temp1.indexOf(".")+1).length()>3)){
System.out.println("yes in the if condition");
}
else
{
System.out.println("no in the else part");
}


due to the requirement i cannot use Bigdecimal or decimal formater as we are doing validation operation on the resulting string.

can any one suggest any solution for that or any work around this problem ???

and is this a java issue ???
  • 1. Re: Double to string giving extra values
    EJP Guru
    Currently Being Moderated
    It is doing exactly what it is supposed to do, and it is all due to your inane 'requirement' that you 'cannot use Bigdecimal or decimal formatter' which would solve the problem.

    You need to have a good look at What every computer scientist should know about floating point, starting with the realization that double d = 0.006 does not have an exact representation. If you want to represent 0.006 exactly in your program text, you must represent it as new BigDecimal("0.006"). No ifs or buts about it.
  • 2. Re: Double to string giving extra values
    802316 Pro
    Currently Being Moderated
    If you have a specific requirement to only produce three decimal places you need to specify this. Otherwise double.toString() will convert the double as it does.

    I don't see why you cannot use BigDecimal or DecimalFormatter as these are often used for validation. (There is a recent question on this subject) I can only assume this is homework. I also assume this doesn't have anything to do with collections. ;)

    If you get one more digit than you want, you can remove it.

    BTW: Validation like this are not fool proof. The string ".!$&" would pass your test.
  • 3. Re: Double to string giving extra values
    883999 Newbie
    Currently Being Moderated
    My problem is not what the defination of floating point ,
    it is when i convert string to double and then again double to string.
    java is adding extra 0 when it is taking a value in Double.

    so according to u, java is adding any arbit value it suits fit and there is no workaround this issue other than using BigDecimal or any other number formater ????
  • 4. Re: Double to string giving extra values
    883999 Newbie
    Currently Being Moderated
    See
    Bug ID: 4428022
    in google and u will find the bug
  • 5. Re: Double to string giving extra values
    EJP Guru
    Currently Being Moderated
    My problem is not what the defination of floating point
    That is exactly your problem. When 0.006 is converted to a double the value is actually more like 0.00600000000000000012490009027033011079765856266021728515625. Then you get some bad rounding.

    The real question is why you're converting exact literals to doubles and back to Strings and expecting the same result. I quote from the bug report you cited: 'In general, it should not be expected that System.out.println(fp_literal) returns the same string as that which comprises fp_literal'. This is not how normal computer programs are written. If you know the value, use it. If the value arises from a computation it probably won't be exactly 0.006 in the first place and if it is and you want an exact decimal representation you should use the facilities provided by the language.
    so according to [you], java is adding any arbit[rary] value it suits
    Don't put words into my mouth. That is a stupid statement and I did not make it.
  • 6. Re: Double to string giving extra values
    796440 Guru
    Currently Being Moderated
    880996 wrote:
    so according to u, java is adding any arbit value it suits fit
    That is absolutely not what he said and absolutely not what is happening.

    First, are you aware that a double cannot hold the value 0.1? And do you know why? And are you aware that this is not Java-specific, but rather is an expected and accepted consequence of the IEEE 754 standard that is used not only by Java but by C, C++, and a host of other languages?

    Second, if I understand your problem, it's with the formatting of the String representation. If you wish to change that, then use java.util.Formatter or java.text.DecimalFormat. (Yes, I know, you said you can't do that. Ridiculous requirement that shows a lack of understanding of computers and programming.)

    Edited by: jverd on Aug 23, 2011 9:53 AM

Legend

  • Correct Answers - 10 points
  • Helpful Answers - 5 points