tioschi
tioschi

Reputation: 389

Arithmetic expression calculates 6.135157E-6 instead of zero

I have the below code somewhere in my app

float private myMethod(float c){
    result = (float) (c+273.15);
}

When "c" gets the value something like -273.1455 the result is something very near to zero like 0.0044.

But when it gets the value -273.15 i get this instead of zero: 6.1035157E-6

Why does this happen?

Upvotes: 2

Views: 223

Answers (3)

Roger Lindsjö
Roger Lindsjö

Reputation: 11543

The problem is that 273.15 is a double, not a float, and neither of them can represent 273.15 exactly. However, since they have different precision they will round actually store different numbers. When the addition is done the c is converted to a double which will be able store the float representation of 273.15. So now you have two doubles with almost the same value and the difference will be non zero.

To get "more predictable" result, use 273.15f to ensure you have floats through the calculations. That should solve this problem but what you need to do is to read up on binary floating point arithmetics and how that differs from decimal arithmetic that we are taught in school.

Wiki on floating point is a good place to start.

Upvotes: 6

Chip
Chip

Reputation: 3316

The problem is not with the value, but with the display to the user.

I'm assuming you are converting it into a String. The way this is done is detailed in http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Double.html#toString(double)

To Display a correct value use the NumberFormat class http://docs.oracle.com/javase/1.4.2/docs/api/java/text/NumberFormat.html

Example :

NumberFormat formater = NumberFormat.getNumberInstance()
formatter.setMaximumFractionDigits(4);
formater.format(myMethod(-273.15))

Now you should get 0.

Upvotes: 0

blub
blub

Reputation: 21

Floating point calculations in computers are not accurate. You should read something about floating point arithmetics to prevent such errors.

Upvotes: 2

Related Questions