KBusc
KBusc

Reputation: 663

Wrong Decimal Converting from Double to String in java

I have A String that is formatted correctly to be cast to a double and it works fine for most decimals. The issue is that for .33, .67, and possibly others I haven't tested, the decimal becomes something like .6700000000002, or .329999999998. I understand why this happens but does any one have a suggestion to fix it.

Upvotes: 2

Views: 1028

Answers (5)

user3146587
user3146587

Reputation: 4320

Some decimal numbers can not be represented accurately with the internal base 2 machine representation.

Upvotes: 3

Marc
Marc

Reputation: 324

It shouldn't be a problem unless you're testing for equality. With floating-point tests for equality you'll need to allow a "delta" so that:

if (a == b)

becomes

if (abs(a-b) < 0.000001)

or a similar small delta value. For printing, limit it to two decimal places and the formatter will round it for you.

Upvotes: 1

Elliott Frisch
Elliott Frisch

Reputation: 201447

It's a result of IEEE-754 rounding rules, some numbers cannot be represented precisely in two's complement. For example, 1/10 is not precisely representable.

You can add more precision (but not infinite) by using BigDecimal.

BigDecimal oneTenth = new BigDecimal("1").divide(new BigDecimal("10"));
System.out.println(oneTenth);

Which outputs 0.1

Upvotes: 4

tcak
tcak

Reputation: 2212

Value of floating point numbers are not stored directly but with exponential values. You may write 3.1233453456356 as number, but this is stored something like 3 and 2^6 in memory. It tries to store a value as close as your number, but those differences can happen.

Upvotes: 1

erzr2
erzr2

Reputation: 165

That's double precision for you. Binary numbers and decimals don't work well together. Unless you are doing something really precise it should be fine, if you are printing it you should use either decimal format or printf.

Upvotes: 1

Related Questions