为啥将浮点数除以整数返回 0.0?

Posted

技术标签:

【中文标题】为啥将浮点数除以整数返回 0.0?【英文标题】:Why does dividing a float by an integer return 0.0?为什么将浮点数除以整数返回 0.0? 【发布时间】:2011-04-16 07:53:08 【问题描述】:

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

这是我想做的事!

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

代码就这么简单

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

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

【问题讨论】:

n 也必须定义为float n 不必是浮点数,只能是数字。但是 1024 必须是 float/double (1024.0) 【参考方案1】:

因为你在做整数除法。

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

double scale = ( n / 1024.0 ) * 255 ;

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

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

【讨论】:

非常感谢您的回答! :)【参考方案2】:

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

请改用n / 1024.0

【讨论】:

非常感谢您的回答! :)【参考方案3】:

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

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

【讨论】:

【参考方案4】:

我认为nint。因为常量 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。尽管如此,您仍然只能得到整数答案,因此您将丢失答案中的任何小数点。

【讨论】:

非常感谢您的回答! :)【参考方案5】:

在您的情况下,n/1024 在进行整数除法时会产生 0。为了克服这个问题,您可以将n 转换为float。这会给你一个介于0.01.0 之间的结果,然后你乘以255 并将结果转换回整数。您还需要将scale 声明为int

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

【讨论】:

【参考方案6】:

其他人已经给出了很好的答案。如果你希望你的比例是一个整数(如果你的 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 的原因。

以上是关于为啥将浮点数除以整数返回 0.0?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 返回 0.0 进行除法? [复制]

为啥 as_tibble() 将浮点数舍入到最接近的整数?

如何将浮点数转换为长度为 4 的字节数组(char* 数组)?

在 C 中,如何将浮点数或双精度数除以 2 的 i 次幂?

C# - 将浮点数转换为整数...并根据余数更改整数

使用 . 将浮点数转换为字符串。而不是 , [重复]