I am trying to increment value of float by 0.1 every time. But i am getting very strange result some time.
float kmVal = 0.0f;
EditText kms = (EditText) findViewById(R.id.km);
kmVal = Float.valueOf(kms.getText().toString());
On Click of button I am incrementing the value.
kmVal += 0.1;
kms.setText(String.valueOf(kmVal));
LOG :-
06-24 13:16:21.644: I/System.out(958): Value ==0.1
06-24 13:16:21.644: I/System.out(958): String Value ==0.1
06-24 13:16:21.886: D/SntpClient(61): request time failed: java.net.SocketException: Address family not supported by protocol
06-24 13:16:22.145: I/System.out(958): Value ==0.2
06-24 13:16:22.145: I/System.out(958): String Value ==0.2
06-24 13:16:22.384: I/System.out(958): Value ==0.3
06-24 13:16:22.384: I/System.out(958): String Value ==0.3
06-24 13:16:22.484: I/System.out(958): Value ==0.4
06-24 13:16:22.484: I/System.out(958): String Value ==0.4
06-24 13:16:22.684: I/System.out(958): Value ==0.5
06-24 13:16:22.684: I/System.out(958): String Value ==0.5
06-24 13:16:22.868: I/System.out(958): Value ==0.6
06-24 13:16:22.874: I/System.out(958): String Value ==0.6
06-24 13:16:23.056: I/System.out(958): Value ==0.70000005
06-24 13:16:23.064: I/System.out(958): String Value ==0.70000005
06-24 13:16:23.884: I/System.out(958): Value ==0.8000001
06-24 13:16:23.884: I/System.out(958): String Value ==0.8000001
06-24 13:16:23.964: D/dalvikvm(353): GC_EXPLICIT freed 7K, 44% free 3532K/6279K, external 716K/1038K, paused 106ms
06-24 13:16:24.536: I/System.out(958): Value ==0.9000001
06-24 13:16:24.536: I/System.out(958): String Value ==0.9000001
As you can see from the log that the value upto 0.6 are ok but after that its adding extra digits that i don’t want. I don’t know why i am getting such result. If anyone has any idea please kindly help.
Thanks
This is because how the floating type numbers are represented. From the JLS:
Hence, float values cannot accurately represent base 10 real numbers. While you might get the initial
0.1, what actually happens is you are getting0.0999999999999999996which is turned into0.1. But as you keep on doing operations on it, it keeps losing precision.Read this and this for more.
For precision use BigDecimal: