Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中执行乘法时出现奇怪的错误?_Java_Android - Fatal编程技术网

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

在java中执行乘法时出现奇怪的错误?,java,android,Java,Android,我这样做,得到w的值为11.07,这是正确的 但当我这么做的时候: 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
的值为11.07,这是正确的

但当我这么做的时候:

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
的值始终为0

有人能给我解释一下为什么会这样吗


顺便说一句,我正在安卓应用程序中做这件事

Cast
int
double

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

遵循BODMAS的规则。。。我用这个规则得到了想要的输出

从最高到最低优先级

B-括号

O-功率

DM-除法和乘法

AS-加和减

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

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

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

    11.076923076923077
正如@JigarJoshi指出的,解决方案是确保使用浮点算法。你可以按照他的建议投,也可以这样做:

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

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

计算结果
w=(double)(FRAME\u REPEAT\u NO*bitmap.getWidth()*height)/(double)(NUM\u FRAMES*bitmap.getHeight())

这允许你生活在整数的可预测的土地上,直到你除法的最后。因此,结果中的任何错误都来自单个操作,而不是聚合多个错误。如果出于任何原因,你决定得到一个整数的结果,你可以放弃双倍,仍然得到11作为答案

没什么大不了的,只是觉得我应该把它放在那里

编辑:我从你在另一篇帖子上的评论中看到,你实际上想要11。好。所以干脆把双打都丢掉:

w=(FRAME\u REPEAT\u NO*bitmap.getWidth()*height)/(NUM\u FRAMES*bitmap.getHeight())


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

OK@JigarJoshi成功了。但是为什么整数没有出现这种情况呢?
height/bitmap.getHeight()
(24/91),根据整数除法,它是0。如果你把int/int除掉,结果也会是int,你会去掉小数部分。所以(FRAME\u REPEAT\u NObitmap.getWidth()*height)/(NUM\u FRAMESbitmap.getHeight())应该以同样的方式工作,对吗?@udiboy:您将再次得到整数除法,因为两个操作数都是整数。请发布错误日志@bExpert没有错误日志;结果与udiboy预期的完全不同。在你的问题中,你写了“乘法时的奇怪错误”。这就是为什么我要错误日志。好的,不,你的问题将由JigarJosi解决。谢谢@Willieweeler。正是我想要的!我的荣幸。请记住,浮点数本质上是近似值。您不应该在需要精确数量的情况下使用它们,例如货币计算。这很棘手,因为货币包含小数,所以看起来应该使用浮动。不。
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());