java - 当我使用 java 添加 float 时,它会添加额外的分数如何避免它们?

标签 java

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

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

最佳答案

这与这样一个事实有关,即许多用十进制表示法看起来很简单的数字不能精确地表示为二进制 float 。

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

因此问题不在于加法,而在于数字本身。但是,错误会随着您的累加而累积。

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

关于java - 当我使用 java 添加 float 时,它会添加额外的分数如何避免它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15564953/

相关文章:

Java,if语句没有返回true boolean 值

java - 实现 i18n 使用 java 的最佳实践是什么?

java - 当我们有访问器和修改器时,为什么要声明私有(private)字段?

java - OpenCsv 用 BeanToCsv + HeaderColumnNameTranslateMappingStrategy 写错列名

java - 如何将 ASCII 值映射到适当的键码?

java - Appengine 实体设计建议

java - 在 Java 中对数组进行排序

java - Android ImageView 设置为本地 URL 不起作用?

java - 从字符串创建 ECPublicKey

java - 传递 HTML 代码作为输入