添加Float值的问题在java中

时间:2017-07-27 11:56:00

标签: java floating-point precision ieee-754

我有两个值

5042034.0 
1425837.2

我正在添加如下

float abc = (float) (5042034.0 + 1425837.2);

我期待6467871.2

的结果

但我得到了6467871.0

如何在浮动帮助下获得6467871.2

我试过

 float c = (float) (1.1 + 2.2) ;

我得到了一个结果:3.3

这背后的原因是什么?

4 个答案:

答案 0 :(得分:4)

Floats是IEEE 754 32位数字。

5042034.0超过2 ^ 22。这意味着,它填充了23位最大的mantisa。它实际上跳过了尾随0。 当您尝试将其添加到1425837.2时,它会调整两个数字:

 10011001110111101110010.00
+  101011100000110101101.0011001100110011001101....
 --------------------------
 11000101011000100011111.0

在二进制系统中。这意味着.0.2超出22位且被跳过。

如果您希望算术更好,请使用doubleBigDecimal代替float

double result = 5042034.0d + 1425837.2d;
BigDecimal bd = BigDecimal.valueOf(5042034.0d + 1425837.2d);

答案 1 :(得分:3)

请尝试double

double abc = (double) (5042034.0 + 1425837.2);

答案 2 :(得分:2)

要支持@xenteros答案,请使用BigDecimal

BigDecimal abc = BigDecimal.valueOf(5042034.0 + 1425837.2);
System.out.println(abc);

将导致6467871.2

更好的是,使用原始的double

double abc = (double) (5042034.0 + 1425837.2);
System.out.println(abc);

N.B:只是想做出贡献,我知道OP在浮动的帮助下问道。

答案 3 :(得分:1)

Java使用IEEE 754标准,支持6-7个有效十进制数字。您的添加结果超出了范围限制,因此您获得了此类结果。enter image description here