views:

182

answers:

3

Hello,

I'm using java and referring to the "double" datatype. To keep it short, I'm reading some values from standard input that I read in my code as doubles (I would much rather use something like BigInteger but right now it's not possible).

I expect to get double values from the user but sometimes they might input things like: 999999999999999999999999999.9999999999 which I think is beyond an accurate representation for double and get's rounded to 1.0E27 (probably).

I would like to get some pointers on how to detect whether a specific value would be unable to be accurately represented in a double and would require rounding (so that I could refuse that value or other such actions).

Thank you very much

+4  A: 

Most values entered by humans won't be exactly representable with a double.

For instance, do you want to prevent the user from entering 0.1? That's not exactly representable as a double.

To find the scale of the error, you could do something like:

BigDecimal userAsDecimal = new BigDecimal(userInput);
double userAsDouble = double.parseDouble(userInput);
BigDecimal doubleToDecimal = new BigDecimal(userAsDouble);
BigDecimal error = userAsDecimal.subtract(userAsDouble).abs();

Then check whether "error" is tolerably small.

Jon Skeet
Indeed you are correct.To be more specific I'll always get positive numbers with at most 10 digits of precision, so my requirment would be to limit the whole part of the number so that it won't cause rounding
cupu
I'm afraid I still don't quite understand. Do you mean you'll only actually get whole numbers? If so, use a long. If not, I'm lost again...
Jon Skeet
I've had a bit of a problem formulating the requestThank you (especially) and everyone else who answered, double is really bad to use in my case ... which I've been complaining a bit for a while :).
cupu
+2  A: 
double orig = GetSomeDouble();
double test1 = orig - 1;
if ( orig == test1 )
   SomethingIsWrong();
double test2 = test1 + 1;
if ( orig != test2 )
   SomethingIsWrong();
TcKs
Thanks for the snippet .. it is a handy test and a good learning experience for me so to speak. I won't be using it probably because I'll eliminate infinite values .. but that's my problem :). Thanks again
cupu
+1  A: 

You can't use a double to store something precisely in the way you're asking, very rarely a user may enter a number that a double can perfectly represent, but that would be coincidence only. If you need to store the exact number you could use a string so long as you don't need to do any manipulation. If you need more than that then there are probably libraries that are made for that kind of precise math.

tloach
Correct, thank you
cupu