【问题标题】:issue with float increment in AndroidAndroid中的浮动增量问题
【发布时间】:2012-06-24 08:04:05
【问题描述】:

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

谢谢

【问题讨论】:

  • 这并不特定于 Android,甚至 Java。

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


【解决方案1】:

这是因为浮点数是如何表示的。来自JLS

任何浮点值集合的有限非零值都可以用s·m·2(e-N+1)的形式表示,其中s为+1或-1,m为小于的正整数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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你能帮我解决这个问题吗?我怎样才能得到精确的浮点数。
    • 请先阅读 java.math.BigDecimal 的 javadoc。从BigDecimal kmVal = new BigDecimal(kms.getText().toString());开始
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多