Java中的双增量

use*_*799 7 java double rounding

可能重复:
如何在Java中以0.1f的增量在0.1f和1.0f之间进行迭代?

我的程序的一部分需要在while循环中使用值:

0.1

0.2

0.3

...

0.9

所以我需要在循环中提供它们.这是代码:

double x = 0.0;
while ( x<=1 )
{
// increment x by 0.1 for each iteration
x += 0.1;
}
Run Code Online (Sandbox Code Playgroud)

我需要输出完全正确:

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

但它实际上给了我一些类似的东西:

0.1

0.2

0.300000000000000000000000004

0.4

0.5

0.6

0.79999999999999999999999999

0.89999999999999999999999999

0.99999999999999999999999999

Ted*_*opp 11

欢迎来到浮点世界,其中0.1不是0.1.问题是许多数字,包括0.1,不能完全用a表示double.所以你并没有真正在x每次循环中添加0.1 .

一种方法是使用整数运算并除以10:

int i = 0;
while (i <= 10) {
    double x = i / 10.0;
    . . .
    i++;
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是创建x一个BigDecimal,您可以指定您想要特定的精度.它基本上是在做上面的循环所做的事情(一个整数加一个刻度),但打包在一个很好的类中,有很多铃声和口哨声.哦,它具有任意精度.

  • @TejaswiRana - 许多使用`double`的应用程序都使用容差来编写,以弥补这一点.对于那些没有这样写的方式,要么舍入错误不重要,要么应用程序有问题.替代方法包括全整数运算,任意精度包(其核心基本上是全整数运算),或有理算术包(同样基于整数). (2认同)
  • @TejaswiRana:就舍入误差而言,浮点数甚至比双倍数还要糟糕。对于银行应用程序,您可能最好保留一定数量的十进制数字,然后乘以金额,以便将它们转换为整数或长整数。 (2认同)
  • @cHao对于银行或会计应用来说,根本就是犯有使用浮点的无能力.我见过承包商为煤炭拖运煤炭并要求自费补救. (2认同)

归档时间:

查看次数:

17959 次

最近记录:

9 年,1 月 前