为什么将float除以整数返回0.0?

时间:2010-09-23 14:48:33

标签: java math division integer-division

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

这就是我想要做的!

但由于某些原因,在Java中(使用Processing)它总是会返回值0。

代码就像这个

一样简单
float scale;
scale = (n/1024) * 255;

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

6 个答案:

答案 0 :(得分:72)

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

除以double或float,它将起作用:

double scale = ( n / 1024.0 ) * 255 ;

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

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

答案 1 :(得分:19)

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

改为使用n / 1024.0

答案 2 :(得分:7)

我认为nint。因为常量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.你仍然只会得到整数答案,所以你将丢失答案中的任何小数点。

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

在你的情况下,n/1024会导致0,因为你正在进行整数除法。要解决此问题,您可以将n投射到float。这将为您提供0.01.0之间的结果,然后乘以255并将结果转换回整数。您还需要将scale声明为int

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

答案 5 :(得分: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;
}