在Android中浮动增量的问题

时间:2012-06-24 08:04:06

标签: java android floating-point increment floating-accuracy

我每次都试图将浮点数的值增加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的值是可以的,但之后它添加了我不想要的额外数字。我不知道为什么我会得到这样的结果。如果有人有任何想法,请帮助。

由于

2 个答案:

答案 0 :(得分:4)

这是因为浮动类型数字的表示方式。来自JLS

  

任何浮点值集的有限非零值都可以用s·m·2(e-N + 1)的形式表示,其中s是+1或-1,m是小于0的正整数2N,e是Emin = - (2K-1-2)和Emax = 2K-1-1之间的整数,其中N和K是取决于值集的参数。

因此,浮点值不能准确地表示基数10实数。虽然您可能会得到最初的0.1,但实际发生的情况是0.0999999999999999996已转为0.1。但是当你继续对它进行操作时,它会不断失去精确度。

阅读thisthis了解更多信息。

精确使用BigDecimal

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

答案 1 :(得分:0)

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