为什么将浮点数除以整数会返回0.0?

40

如果我有一个数字范围为“0-1024”,我想将它们转换到“0-255”范围内,数学上的做法是将输入值除以输入值的最大值(在此情况下是1024),这样可以得到一个介于0.0和1.0之间的数字。然后将该数字乘以目标范围(255)。

这正是我想要做的事情!

但是出于某种原因,在Java(使用Processing)中,它总是返回一个值为0的结果。

���码非常简单,如下所示:

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

但我得到的只是0.0。我已经尝试了双精度和整型,但都没有成功。为什么?


2
n 也必须被定义为 float - Felix Kling
2
n不必是浮点数,只要是数字即可。但是1024必须是浮点数/双精度(1024.0)。 - KevinDTimm
6个回答

74

这是因为您正在进行整数除法。

尝试用double或float类型进行除法,即可解决问题:

double scale = ( n / 1024.0 ) * 255 ;

如果您想将其作为浮点数表示,

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

19

n / 1024是整数除法,结果为整数(在这种情况下为0)。

请改用n / 1024.0


7
我猜测 n 是一个整数。因为常量 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.

最后一种方法仍然使用整数运算,但改变操作顺序意味着您不会得到不希望的截断为0的结果。但您仍然只能得到整数答案,因此将失去任何答案中的小数点。


2
在您的情况下,n/1024 的结果为0,因为您正在进行整数除法。为了克服这个问题,您可以将n转换为float。这将给您一个介于0.01.0之间的结果,接下来您需要乘以255并将结果转换回整数。此外,您需要将scale声明为int
int scale;
int n = 80; 
scale = (int)(((float)n/1024) * 255);

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;
}

呵呵,这就是我讨厌 BigInteger 和 BigDecimal 的原因。 - Tony Ennis

2
你应该先将n转换为浮点数,通过乘法进行自动转换,否则你所做的是整数运算,然后强制转换结果,而不是在两个浮点数之间进行运算。
float scale;
scale = n * 1.0 / 1024 * 255;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接