1

我尝试运行以下代码:

double f = 4.35; 
int n = (int) (100 * f); 

n434。为什么?

4

4 回答 4

2

4.35 不能精确地表示为浮点数,因为 0.35 不是 2 的(负)幂。因此,以某种方式存在一些舍入。乘以 100 时可能还会进行舍入。如果结果数字略小于 435,则转换为 int 将占用它的底数,即 434。

如果您想四舍五入到 NEAREST 整数,您可以将 0.5 添加到结果中,然后转换为 int。这是对数字进行四舍五入的最通用方法,尽管 Java 有一个内置的舍入实现。

double f = 4.35; 
int n = (int) (100 * f + 0.5); 
于 2012-10-28T17:35:10.497 回答
1

你需要看这个。我让大学一年级的学生看它做作业。http://vimeo.com/7403673 - Jon Skeet 和小马托尼。

Jon Skeet 在伦敦 Stack Overflow DevDays 活动上的演讲:stackoverflow.carsonified.com

在 6:50 左右,他谈到了 Java 中的数学以及开发人员在数学方面面临的一些常见问题。

于 2012-10-28T17:29:08.407 回答
1

试试这个:

double f = 4.35; 
int n = (int) Math.round(100 * f);

正如预期的那样,现在n将具有 as value 。435在处理以 2 为底的十进制值时,由于舍入错误而发生此类问题,请查看此参考以了解更多信息:What Every Computer Scientist Should Know About Floating-Point Arithmetic

于 2012-10-28T17:30:28.020 回答
0

这是因为浮点数在内部以基数 2 而非基数 10 表示。

这在这里会有所帮助(必须导入Math):

double f = 4.35; 
long n = Math.round(100 * f); 
于 2012-10-28T17:34:48.327 回答