2012-10-28 72 views
1

我试图运行下面的代码:损失精度

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

n434。为什么?

+8

[每个计算机科学家都应该知道的浮点算术](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。 – Oded

回答

2

4.35不能准确地表示为浮动因为0.35不是2的(负)幂。因此,这种或那种方式有一点舍入。当你乘以100时,可能还会有四舍五入的结果。如果结果数字少于435,则投射到int将占据它的底部,即434.

如果您想轮到NEAREST integer,你可以在结果中加0.5,然后转换为int。这是对数字进行舍入的最普通的方式,尽管Java内置了四舍五入的实现。

double f = 4.35; 
int n = (int) (100 * f + 0.5); 
1

您需要观看此视频。我做了第一年的单身学生看作业。 http://vimeo.com/7403673 - Jon Skeet和托尼小马。

乔恩斯基特的介绍在伦敦堆栈溢出DevDays事件:stackoverflow.carsonified.com

在6点50分左右,他谈到了在Java中数学和所面临的一些开发人员关于数学的共同问题。

+1

没有某种总结就没有答案。 –

+0

如果我没有找到视频如此有趣,我会低估你的答案:) – devsnd

0

这是因为浮点数内部基2中表示,以免基部10

这这里将帮助(必须导入Math):

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