我有两个值
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
这背后的原因是什么?
答案 0 :(得分:4)
Floats是IEEE 754 32位数字。
5042034.0超过2 ^ 22。这意味着,它填充了23位最大的mantisa。它实际上跳过了尾随0。 当您尝试将其添加到1425837.2时,它会调整两个数字:
10011001110111101110010.00
+ 101011100000110101101.0011001100110011001101....
--------------------------
11000101011000100011111.0
在二进制系统中。这意味着.0
和.2
超出22位且被跳过。
如果您希望算术更好,请使用double
或BigDecimal
代替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)