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

在java中,如何将整数上某些操作的结果存储到不同的数据类型,java,casting,floating-point,Java,Casting,Floating Point,所以我有两个整数,我把它们相加,然后除以2,得到它们的中值。我想存储它们的浮动结果。所以我在做- float res = (float) (num1 + num2) / 2; 有时,对于非零输入,此表达式返回0.0。我认为问题在于num1和num2的范围可以变化到32位的全频谱。因此,当两者都处于高光谱时,float cast会中断,因为它无法存储结果并返回0.0 我不想做(float)num1/2+(float)num2/2,因为在此过程中可能会丢失十进制精度 任何关于如何处理此场景的指针。

所以我有两个整数,我把它们相加,然后除以2,得到它们的中值。我想存储它们的浮动结果。所以我在做-

float res = (float) (num1 + num2) / 2;
有时,对于非零输入,此表达式返回0.0。我认为问题在于num1和num2的范围可以变化到32位的全频谱。因此,当两者都处于高光谱时,float cast会中断,因为它无法存储结果并返回0.0

我不想做
(float)num1/2+(float)num2/2
,因为在此过程中可能会丢失十进制精度

任何关于如何处理此场景的指针。

为此使用type

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();
为此,请使用类型

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();

根据您的实际需求,float也可能无法达到目的

要获得正确的结果,请尝试以下方法:

int num 1 = ...
int num 2 = ...
double avg = (((long) num1) + num2) / 2D;
要点是将int添加为long(将一个强制转换为long,另一个自动强制转换,因为long+int会导致加宽转换)。这避免了两个整数之和大于integer.MAX_值(或小于integer.MIN_值)时可能出现的整数溢出


然后除以2,通过将2文本作为双文本后缀,不需要显式转换。同样,对于除法,这会导致一个隐式加宽转换,其中long/double=double。

根据您的实际需求,float可能也不会起作用

要获得正确的结果,请尝试以下方法:

int num 1 = ...
int num 2 = ...
double avg = (((long) num1) + num2) / 2D;
要点是将int添加为long(将一个强制转换为long,另一个自动强制转换,因为long+int会导致加宽转换)。这避免了两个整数之和大于integer.MAX_值(或小于integer.MIN_值)时可能出现的整数溢出


然后除以2,通过将2文本作为双文本后缀,不需要显式转换。同样,对于除法,这会导致一个隐式加宽转换,其中long/double=double。

我做了一个简单的测试,正如我在评论中提到的,您可以使用
double
long
进行转换(作为另一个选项):

输出

Size: 32
Max Value: 2147483647
Float Cast: 2147483648.000000
Double Cast: 2147483647.000000
Long Cast: 2147483647.000000

我做了一个简单的测试,正如我在评论中提到的,您可以使用
double
long
(作为另一个选项):

输出

Size: 32
Max Value: 2147483647
Float Cast: 2147483648.000000
Double Cast: 2147483647.000000
Long Cast: 2147483647.000000


使用
double
而不是
float
并在分割前强制转换?请注意,有2^32个可能的
int
值和2^32个可能的
float
值。这意味着有一些
int
值无法在
float
中正确表示。因此,如果
num1
num2
可以在
int
值的范围内的任何地方,那么您的努力注定会失败。浮点数不会破坏它们。发生的事情是你在做整数除法。您可以使用num1/2d或num/2f,这样就不会把一切都搞得一团糟。但是,把num1和num2转换成double,然后用double做所有的数学运算。似乎是保留所有位的最佳方法。使用
double
而不是
float
并在除法前强制转换?请注意有2^32个可能的
int
值和2^32个可能的
float
值。这意味着有一些
int
值无法在
float
中正确表示。因此,如果
num1
num2
可以在
int
值的范围内的任何地方,那么您的努力注定会失败。浮点数不会破坏它们。发生的事情是你在做整数除法。您可以使用num1/2d或num/2f,这样就不会把一切都搞得一团糟。但是,把num1和num2转换成double,然后用double做所有的数学运算。似乎是保存所有位的最佳方法。虽然可以简单地使用基元类型,但为什么要使用类类型?@Yahya,因为问题是基元类型不够好。以额外开销为代价,类类型更可靠,这就是它存在的原因。人们经常问这个问题。基元类型不够严格,无法保持浮点值。例如,尝试求和0.1d+0.1d+0.1d,结果大约为0.300000000000000004任何int/2D都会给出一个非常精确的双精度结果。BigDecimal在这方面做得太过分了,正如Durandal正确指出的那样。虽然可以简单地使用基元类型,但为什么要使用类类型?@Yahya,因为问题是基元类型不够好。以额外开销为代价,类类型更可靠,这就是它存在的原因。人们经常问这个问题。基元类型不够严格,无法保持浮点值。例如,尝试0.1d+0.1d+0.1d之和,结果将类似于0.3000000000004任何int/2D都会给出一个非常精确的双精度结果。正如Durandal正确指出的,BigDecimal在这方面做得太过分了。这只是@Durandal的一个不太完整的版本。。。。你还有什么补充信息吗?否则,这应该保留在评论中。@Tezra这是怎么回事?在你没有解释“尽管你可以简单地使用基元类型,但为什么要使用类”来解决这个问题后,你是在发自内心地说还是只是想评论什么?顺便说一句,我是第一个评论铸造和改变双FYI!不,我只是说,这个答案是在之后发布的,所以你可能应该在评论中链接相关的代码。。。。我提出了我的理由。如果你不同意,那是你的意见。我只是建议“这可能应该是一个评论而不是回答”,而不是“你错了”。(从技术上讲,我也是在说你的权利,因为我