为什么用一个整数来分隔一个浮点数返回0.0?

所以如果我有一个范围的数字'0 – 1024',我想把他们带到'0 – 255',math将决定分割input的最大input将是(在这种情况下1024),这将给我在0.0 – 1.0之间的数字。 然后乘以目标范围(255)。

这是我想要做的!

但是出于某种原因,在Java中(使用处理)它将始终返回值为0。

代码将如此简单

float scale; scale = (n/1024) * 255; 

但是我只得到0.0。 我试过double和int。 一切都无济于事。 为什么!?

这是因为你在做整数除法。

除以双重或浮动,它将工作:

 double scale = ( n / 1024.0 ) * 255 ; 

或者,如果你想要它作为一个浮动,

 float scale = ( n / 1024.0f ) * 255 ; 

n / 1024是整数除法 ,它产生一个整数(即在这种情况下为0)。

改用n / 1024.0

我认为n是一个int 。 因为常量1024和255都是int所有右边的计算都是用整数运算完成的。 意思是将n/1024的结果截断为一个整数值,然后再乘以255

任何这些修改将使计算正常工作:

 scale = n / 1024.0 * 255.0; // Use double constants. scale = (double) n / 1024 * 255; // Convert n to a double. scale = n * 255 / 1024; // Multiply before dividing. 

最后一个仍然使用整数math,但切换操作的顺序意味着你不会得到不需要的截断为0.你仍然只会得到整数的答案,所以你会失去答案中的任何小数点。

你应该通过乘法FIRST自动将n赋值为浮点数,否则就是执行一个整数运算,然后转换结果,而不是在浮点数之间进行操作。

 float scale; scale = n * 1.0 / 1024 * 255; 

在你的情况下, n/1024结果为0,因为你正在做整数除法。 为了克服这个问题,你可以投nfloat 。 这会给你一个0.01.0之间的结果,然后你乘以255并将结果转换回整数。 你也需要将scale声明为int

 int scale; int n = 80; scale = (int)(((float)n/1024) * 255); 

其他人已经给出了很好的答案。 如果你想要你的规模是一个整数(这是有道理的,如果你的n是一个整数已经),你可以做

 int scale = ((255 * n)/1024); 

请注意,只要这些是数字,就不会遇到任何问题,因为当最大值n = 1024时,n * 255将始终适合int。

更灵活的将是

 int scale(int value, int old_max, int new_max){ java.math.BigInteger big_value = java.math.BigInteger.valueOf(value); java.math.BigInteger big_old_max = java.math.BigInteger.valueOf(old_max); java.math.BigInteger big_new_max = java.math.BigInteger.valueOf(new_max); java.math.BigInteger mult = big_value.multiply(big_old_max); return (int) mult.devide(big_new_max).doubleValue(); } 

你不会以这种方式溢出,尽pipe我承认这有点冗长

编辑:

基本相同但不太笨重(尽pipe对于非常高的数字,您可能会遇到一些准确的错误)

 int scale(int value, int old_max, int new_max){ double factor = (double) new_max / (double) old_max; return factor * value; } 
    Interesting Posts