为啥将浮点数除以整数返回 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】:我认为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。尽管如此,您仍然只能得到整数答案,因此您将丢失答案中的任何小数点。
【讨论】:
非常感谢您的回答! :)【参考方案5】:在您的情况下,n/1024
在进行整数除法时会产生 0。为了克服这个问题,您可以将n
转换为float
。这会给你一个介于0.0
和1.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?的主要内容,如果未能解决你的问题,请参考以下文章