Kioko Kiaza
Kioko Kiaza

Reputation: 1398

Comma double numbers multiplication

Why this java code returns 61.004999999999995 instead of 61,005 ?? I don´t get it.

System.out.println(105*0.581); 

Upvotes: 0

Views: 268

Answers (2)

David Kühner
David Kühner

Reputation: 803

You fall into a floating point precision problem. In computer science there is a simple (but anoing) fact : you cannot represent all real numbers. It's also true for Java.

If you want to go deeper, you can study how floating point number are stores in memory. Key words are : bit of sign; mantissa and exponent. Be aware that the precision also depends on the system memory (32or64) http://en.wikipedia.org/wiki/Single-precision_floating-point_format

Java speaking, for more precision you can use BigDecimal :

System.out.println(new BigDecimal(105).multiply(new BigDecimal(0.581));

You can also round it with round(MathContext mc) which in this case will give you 61.005 if you set the precision to 5.

System.out.println(new BigDecimal(105).multiply(new BigDecimal(0.581)).round(new MathContext(5)));

https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html

If it's just a question about how to display it and the precision dosen't matter, you can use the DecimalFormat.

System.out.println(new DecimalFormat("###.###").format(105*0.581));

https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html

Upvotes: 2

Hanssel Abreu
Hanssel Abreu

Reputation: 21

It occurs due to the nature of floating point numbers . Computers are not very intelligent working with floating point numbers , so we have to work based on approximations. Instead of 6.005 == 6.004999 , you should do this: 6.005 - 6.004999 < = 0.001

Upvotes: 2

Related Questions