3

我正在尝试添加一长串我定义为浮点数的数字。数字显示为自爆,如图所示,它在添加数字时会添加一些额外的分数,如何避免这些?我应该使用哪种数据类型?

float number;
float sum;
....{
   ........
   System.out.println(number);               
   sum = sum + number;
   System.out.println("sum:" + sum);
}

结果

3.96
sum:3.96
5.04
sum:9.0
5.04
sum:14.04
2.16
sum:16.2
1.44
sum:17.640001
3.96
sum:21.600002
3.96
sum:25.560001
2.88
sum:28.440002
10.26
sum:38.700005
1.62
sum:40.320004
3.01
sum:43.33
1.8
sum:45.13
1.98
sum:47.11
1.935
sum:49.045002
3.96
sum:53.005
1.44
sum:54.445
1.44
sum:55.885
1.44
sum:57.324997
6.48
sum:63.804996
4.3
sum:68.104996
4

2 回答 2

6

这与许多在十进制表示法中看起来很简单的数字不能完全表示为二进制浮点数有关。

让我们检查一下您的示例中的第一个数字,3.96。当你将它存储在 afloat中时,它就变成了3.95999999999999996447. 打印时会四舍五入,因此除非您将数字打印为许多有效数字,否则您不会看到错误。

因此,问题与加法无关,而与数字本身有关。但是,错误会随着您的添加而累积。

如果您希望您的计算准确,您可以使用BigDecimal而不是float/ double

于 2013-03-22T07:27:40.327 回答
0

您可以使用 printf

System.out.printf("%.2f", sum);
于 2013-03-22T07:26:42.237 回答