我尝试运行以下代码:
double f = 4.35;
int n = (int) (100 * f);
n
将为434
。为什么呢?
答案 0 :(得分:2)
4.35不能完全表示为浮点数,因为.35不是2的(负)幂。因此,有一些方法可以这样或那样。当你乘以100时,可能还会有一个舍入。如果结果数小于435,那么转换为int将占据它的最低点,即434。
如果要舍入到NEAREST整数,可以在结果中加0.5,然后转换为int。这是舍入数字的最常用方法,尽管Java有一个内置的舍入实现。
double f = 4.35;
int n = (int) (100 * f + 0.5);
答案 1 :(得分:1)
你需要看这个。我让第一年的大学生们看它做作业。 http://vimeo.com/7403673 - Jon Skeet和Tony the Pony。
Jon Skeet在伦敦Stack Overflow DevDays活动中的演讲:stackoverflow.carsonified.com
大约在6点50分,他谈到了Java中的数学和开发人员在数学方面遇到的一些常见问题。
答案 2 :(得分:1)
请改为尝试:
double f = 4.35;
int n = (int) Math.round(100 * f);
现在n
的值为435
,如预期的那样。出现这种问题是因为在处理基数2中表示的十进制值时出现舍入错误,请查看此引用以了解更多信息:What Every Computer Scientist Should Know About Floating-Point Arithmetic。
答案 3 :(得分:0)
这是因为浮点数在基数2内部表示而不是基数10。
这里有帮助(必须导入Math
):
double f = 4.35;
long n = Math.round(100 * f);