如何将Integer上的某些操作的结果存储到java中的不同数据类型中

时间:2017-06-01 18:57:15

标签: java casting floating-point

所以我有两个整数,我通过添加它们然后将它们除以2来找到它们的中位数。我想存储它们的浮动结果。我正在做 -

float res = (float) (num1 + num2) / 2;

有时,对于非零输入,此表达式返回0.0。我认为问题是num1和num2范围可以变化到32位的全谱。因此,当两者都处于高光谱时,浮动抛出会因为无法存储结果而中断,并返回0.0。

我不想做(float)num1/2 + (float)num2/2,因为在此过程中我可能会忽略小数精度。

关于如何处理这种情况的任何指示。

3 个答案:

答案 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));

如果num1num2是浮点类型,请使用

BigDecimal sum = new BigDecimal(num1).add(new BigDecimal(num2));

然后你可以从结果中获取任何类型,例如

double v = result.doubleValue();

答案 2 :(得分:0)

我做了一个简单的测试,正如我在评论中提到,你可以使用doublelong(作为另一个选项)进行投射:

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