40

因此,如果我有一个数字范围“0 - 1024”并且我想将它们带入“0 - 255”,那么数学将要求将输入除以输入的最大值(在这种情况下为 1024),这将给出我是一个介于 0.0 - 1.0 之间的数字。然后乘以目标范围,(255)。

这就是我想做的!

但是由于某种原因在 Java 中(使用处理)它总是会返回一个 0 的值。

代码就这么简单

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

但我只得到0.0。我试过双精度和整数。一切都无济于事。为什么!?

4

6 回答 6

74

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

除以双精度或浮点数,它将起作用:

double scale = ( n / 1024.0 ) * 255 ;

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

float scale = ( n / 1024.0f ) * 255 ;
于 2010-09-23T14:51:23.130 回答
19

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

改为使用n / 1024.0

于 2010-09-23T14:51:49.287 回答
7

我认为n是一个int. 因为常量 1024 和 255 都是ints,所以所有右手边的计算都是用整数算术完成的。这意味着 的结果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。尽管如此,您仍然只会得到整数答案,因此您将丢失答案中的任何小数点。

于 2010-09-23T14:52:43.357 回答
2

其他人已经给出了很好的答案。如果您希望您的比例是一个整数(如果您的 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;
}
于 2010-09-23T15:11:20.073 回答
2

您应该首先通过乘法将 n 自动转换为浮点数,否则您将进行整数运算然后转换结果,而不是在浮点数之间进行运算。

float scale;
scale = n * 1.0 / 1024 * 255;
于 2010-09-23T14:52:01.830 回答
2

在您的情况下n/1024,当您进行整数除法时,结果为 0。要克服这个问题,您可以n转换为float. 这会给你一个结果,0.0然后1.0你乘以255并将结果转换回整数。您还需要声明scaleint

int scale;
int n = 80; 
scale = (int)(((float)n/1024) * 255);
于 2010-09-23T14:53:33.857 回答