所以我有两个整数,我通过添加它们然后将它们除以2来找到它们的中位数。我想存储它们的浮动结果。我正在做 -
float res = (float) (num1 + num2) / 2;
有时,对于非零输入,此表达式返回0.0。我认为问题是num1和num2范围可以变化到32位的全谱。因此,当两者都处于高光谱时,浮动抛出会因为无法存储结果而中断,并返回0.0。
我不想做(float)num1/2 + (float)num2/2
,因为在此过程中我可能会忽略小数精度。
关于如何处理这种情况的任何指示。
答案 0 :(得分:5)
根据您的实际要求,浮动也可能无法解决问题。
要获得正确的结果,请尝试:
int num 1 = ...
int num 2 = ...
double avg = (((long) num1) + num2) / 2D;
重点是将int添加为long(将一个转换为long,另一个是自动转换,因为long + int会导致扩展转换)。当两个int的总和大于Integer.MAX_VALUE(或小于Integer.MIN_VALUE)时,这可以避免可能的整数溢出。
然后除以2,通过将2个文字后缀为双字面值,不需要显式强制转换。对于除法,这会导致隐式加宽转换,其中long / double = double。
答案 1 :(得分:1)
为此目的使用BigDecimal类型。
int num1 = 1;
int num2 = 2;
BigDecimal sum = new BigDecimal(num1 + num2);
BigDecimal result = sum.divide(new BigDecimal(2));
如果num1
和num2
是浮点类型,请使用
BigDecimal sum = new BigDecimal(num1).add(new BigDecimal(num2));
然后你可以从结果中获取任何类型,例如
double v = result.doubleValue();
答案 2 :(得分:0)
我做了一个简单的测试,正如我在评论中提到,你可以使用double
或long
(作为另一个选项)进行投射:
public class Casting {
public static void main(String[] args) {
// the maximum positive value for a signed binary integer
int num1 = Integer.MAX_VALUE;
int num2 = Integer.MAX_VALUE;
float resFloat = ((float)num1 + num2) / 2;
double resDouble = ((double)num1 + num2) / 2;
double resLong = ((long)num1 + num2) / 2;
// Testing [Expected Result is 2147483647]
System.out.println("Size: " + Integer.SIZE); // in bits (on my machine)
System.out.println("Max Value: " + Integer.MAX_VALUE);
System.out.printf("Float Cast: %f\n", resFloat);
System.out.printf("Double Cast: %f\n", resDouble);
System.out.printf("Long Cast: %f\n", resLong);
}
}
<强>输出强>
Size: 32
Max Value: 2147483647
Float Cast: 2147483648.000000
Double Cast: 2147483647.000000
Long Cast: 2147483647.000000