问题与Android的浮动增量(issue with float increment in Andr

2019-09-18 10:32发布

我试图通过0.1每次递增浮动值。 但我得到很奇怪的结果一段时间。

float kmVal = 0.0f;    
EditText kms = (EditText) findViewById(R.id.km);
kmVal = Float.valueOf(kms.getText().toString()); 

在点击按钮的我的值递增。

kmVal += 0.1;
kms.setText(String.valueOf(kmVal));

日志: -

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

正如你可以从日志中看到,高达0.6的值是确定,但之后其加入额外的数字,我不想要的。 我不知道为什么我得到这样的结果。 如果任何人有任何想法,请好心帮。

谢谢

Answer 1:

这是因为浮动式数字是如何表示。 从JLS :

任何浮点值集的有限的非零值都可以在形式S·米表示·图2(e - N + 1),其中s是1或-1,m大于2N以下的正整数,并且e是额敏=之间的整数 - (2K-1-2)和E max = 2K-1-1,包括端值,并且其中,N和K是取决于设置的值的参数。

因此,浮点值不能准确地表示基体10张的实数。 虽然你可能会得到最初的0.1 ,实际发生的事情是你所得到0.0999999999999999996也就是变成0.1 。 但是当你继续它做的操作,它使失去精度。

阅读这和这更多。

对于精密使用的BigDecimal :

BigDecimal test = new BigDecimal("0.1");
test = test.add(new BigDecimal("0.1"));
System.out.println(test);


Answer 2:

如果你真的需要浮点值的精确表示,那么你的确不能用简单的浮点类型,如doublefloat在任何语言。 在Java中,你可以使用BigDecimal 。 但是,我会首先弄清楚你是否真的需要这个确切的浮点与否。



文章来源: issue with float increment in Android