因此,如果我有一个数字范围“0 - 1024”并且我想将它们带入“0 - 255”,那么数学将要求将输入除以输入的最大值(在这种情况下为 1024),这将给出我是一个介于 0.0 - 1.0 之间的数字。然后乘以目标范围,(255)。
这就是我想做的!
但是由于某种原因在 Java 中(使用处理)它总是会返回一个 0 的值。
代码就这么简单
float scale;
scale = (n/1024) * 255;
但我只得到0.0。我试过双精度和整数。一切都无济于事。为什么!?
因此,如果我有一个数字范围“0 - 1024”并且我想将它们带入“0 - 255”,那么数学将要求将输入除以输入的最大值(在这种情况下为 1024),这将给出我是一个介于 0.0 - 1.0 之间的数字。然后乘以目标范围,(255)。
这就是我想做的!
但是由于某种原因在 Java 中(使用处理)它总是会返回一个 0 的值。
代码就这么简单
float scale;
scale = (n/1024) * 255;
但我只得到0.0。我试过双精度和整数。一切都无济于事。为什么!?
这是因为你正在做整数除法。
除以双精度或浮点数,它将起作用:
double scale = ( n / 1024.0 ) * 255 ;
或者,如果你想要它作为一个浮点数,
float scale = ( n / 1024.0f ) * 255 ;
n / 1024 是整数除法,它产生一个整数(即在这种情况下为 0)。
改为使用n / 1024.0
。
我认为n
是一个int
. 因为常量 1024 和 255 都是int
s,所以所有右手边的计算都是用整数算术完成的。这意味着 的结果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.
最后一个仍然使用整数数学,但切换操作顺序意味着您不会将不希望的截断变为 0。尽管如此,您仍然只会得到整数答案,因此您将丢失答案中的任何小数点。
其他人已经给出了很好的答案。如果您希望您的比例是一个整数(如果您的 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();
}
你不会以这种方式溢出任何整数,尽管我承认这有点冗长
编辑:
基本相同,但不那么笨重(尽管对于非常大的数字,您可能会遇到一些精度错误)
int scale(int value, int old_max, int new_max){
double factor = (double) new_max / (double) old_max;
return factor * value;
}
您应该首先通过乘法将 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);