为什么用一个整数来分隔一个浮点数返回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,因为你正在做整数除法。 为了克服这个问题,你可以投n
来float
。 这会给你一个0.0
和1.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; }