在java中进行乘法时出现奇怪的错误?

时间:2012-07-10 05:19:05

标签: java android

public static int NUM_FRAMES = 8;
public static int FRAME_REPEAT_NO = 2;
int height = 24;
//bitmap.getWidth() is 168 and bitmap.getHeight() is 91

double w = bitmap.getWidth();
w = w/NUM_FRAMES;
w = w*FRAME_REPEAT_NO;
w = w*height;
w = w/bitmap.getHeight();

我这样做,我得到w的值为11.07,这是正确的。

但是当我这样做时:

double w  = FRAME_REPEAT_NO*(bitmap.getWidth()/NUM_FRAMES)*(height/bitmap.getHeight());

w的值始终为0;

有人可以向我解释为什么会这样吗?

P.S。我在Android应用程序中这样做...

4 个答案:

答案 0 :(得分:1)

int投放到double

double w  = FRAME_REPEAT_NO*(bitmap.getWidth()/((double)NUM_FRAMES))*(height/((double)bitmap.getHeight()));

答案 1 :(得分:1)

在需要浮点运算的情况下使用整数运算:

double w = FRAME_REPEAT_NO*(bitmap.getWidth()/NUM_FRAMES)*(height/bitmap.getHeight());
//     w =              2 * (168             / 8       ) * (  24 / 91);
//     w =              2 * (21                        ) * ( 0 );
//     w = 0;

正如@JigarJoshi指出的那样,解决方案是确保使用浮点运算。你可以根据他的建议进行投射,或者你可以做这样的事情:

public static float NUM_FRAMES = 8.0f;
public static float FRAME_REPEAT_NO = 2.0f;
float height = 24.0f;

float w  = FRAME_REPEAT_NO * (bitmap.getWidth() / NUM_FRAMES) *
                             (height / bitmap.getHeight());

答案 2 :(得分:0)

按照 BODMAS 规则...我使用此规则获得了所需的输出...

最高到最低优先级..

B - Brackets

O - 权力

DM - Divison and Multiplication

AS - 添加和减少

 w =  ((w/NUM_FRAMES)*(FRAME_REPEAT_NO)*(height))/bitmap.getHeight();

<强>输出:

    11.076923076923077

答案 3 :(得分:0)

其他人已经解决了你的问题,所以我不会重复他们的答案,但我会提出一个建议。考虑使用

计算结果

w = (double)(FRAME_REPEAT_NO * bitmap.getWidth() * height) / (double)(NUM_FRAMES * bitmap.getHeight())

这使你可以生活在可预测的整数范围内,直到你进行分裂的最后。因此,结果中的任何错误都来自单个操作,而不是聚合多个错误。如果由于某种原因你决定要获得整数结果,你可以放弃双打并仍然得到11作为答案。

没什么大不了的,只是以为我会把它放在那里。

编辑:我从你对另一篇帖子的评论中看到你真的想要11.好。所以完全放弃双打:

w = (FRAME_REPEAT_NO * bitmap.getWidth() * height) / (NUM_FRAMES * bitmap.getHeight())

答案正好是11(整数),这与浮点近似值11.0的方式不同。