精度损失

时间:2012-10-28 17:27:30

标签: java precision

我尝试运行以下代码:

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

n将为434。为什么呢?

4 个答案:

答案 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);