【问题标题】:Decimals such as 0.1 and 0.2 equal 0.30000000000000004 [duplicate]0.1 和 0.2 等小数等于 0.30000000000000004 [重复]
【发布时间】:2014-05-05 18:46:18
【问题描述】:

我有一个按钮,当我按下它时,我希望它将标签(从 0.0 开始)更新为 + 0.1

我得到以下信息:

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.79999999999999999
0.89999999999999999
0.99999999999999999
1.09999999999999999

我的代码是:

  double Number = Double.parseDouble(txtNumber.getText());
  double Generator = 0.1;
  Number = (Number + Generator);
  txtNumber.setText(Number + "");

我知道计算机处理数字的方式并不完全是 0.3,而更像是 0.2999999... 我只是想要一种对数字进行四舍五入的方法,这样我就可以轻松地将 0.1(to)0.9 加在一起而无需大量小数位。

我已经尝试添加

Math.round((Number + Generator) * 100) / 100;

虽然它向下舍入为 0,因此标签不会更新。

【问题讨论】:

标签: java swing floating-point decimal


【解决方案1】:
String myNumberString = String.format("%1.1d", Double.valueOf(myNumber));

【讨论】:

    【解决方案2】:

    如果您想要精确的小数加法,您需要使用BigDecimal 代替double

    BigDecimal number = new BigDecimal(txtNumber.getText());
    BigDecimal generator = new BigDecimal("0.1"); // The "" marks are important
    number = number.add(generator);
    txtNumber.setText(number.toString());
    

    【讨论】:

      【解决方案3】:

      一些小数根本无法用floatdouble 表示,这样差异就足够小了。仅仅因为计算机使用二进制数系统。例如,计算机总是无法代表 1/3。

      您可以使用格式,使用以下代码将数字四舍五入到一位小数:

      double value = 0.3d;
      String.format("%1.1d",value);
      

      【讨论】:

      • 其实问题出在加法上,而不是内部表示。可以用double 表示0.3,然后打印double 并查看0.3。问题是它与将0.1 添加到0.2 得到的double 不同。
      • 如果我没记错 IEEE745,将两个具有相同指数的数字相加,将始终是正确的相加。然而问题是0.10.2 都不能正确表示。
      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 2020-02-15
      • 2013-03-10
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 2015-05-10
      相关资源
      最近更新 更多