Question

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

Was it helpful?

Solution

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.

OTHER TIPS

double orig = GetSomeDouble();
double test1 = orig - 1;
if ( orig == test1 )
   SomethingIsWrong();
double test2 = test1 + 1;
if ( orig != test2 )
   SomethingIsWrong();

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top