这扩大一点在prior answer。
原始程序在评论中包含一个声明y
是2147483647.它不是。由于浮点四舍五入,这是2147483648.该程序看起来在y
,和可表示的数字包围它。 BigDecimal的toString
在没有科学记数法的情况下做了精确的转换,对于这种情况更为明确。 BigDecimal还对有限长度小数展开的数字进行精确算术,包括所有有限浮点数和双数。
import java.math.BigDecimal;
public class Test {
private static final float V1 = 1076712940;
private static final float V2 = 1070770707;
public static void main(String[] args) {
final float y = V1 + V2;// 2147483647
BigDecimal yBD = new BigDecimal(y);
System.out.println("y = " + yBD);
BigDecimal down = new BigDecimal(Math.nextDown(y));
System.out.println("nextDown(y) = " + down + " diff = " + yBD.subtract(down));
BigDecimal up = new BigDecimal(Math.nextUp(y));
System.out.println("nextUp(y) = " + up + " diff = " + up.subtract(yBD));
System.out.println(Float.MAX_VALUE + Float.MAX_VALUE);
}
}
输出:
y = 2147483648
nextDown(y) = 2147483520 diff = 128
nextUp(y) = 2147483904 diff = 256
Infinity
2147483648是二的幂,所以它下面的间隙只有128,但上述的间隙是256减去任何小于64具有精确的结果更接近2147483648比任何其他可表示的数字。减去64会得出两个数字中间的精确结果,并且可以向2147483648舍入。减去65得到的结果更接近2147483520.
在评论中,您问:“我将V1
和V2
为Float.MAX_VALUE
结果变了A:真B:假C:假你对此有何看法?
我的第一个想法,从我的程序的最后输出得到证实,是“这使得y
无限。”。从无穷大增加或减少有限数字不会改变其值。无限等于自身。
一般来说,如果直接查看所涉及的数字,可以更容易地看到发生了什么,而不仅仅是查看测试结果和涉及它们的比较。
你认为'float'具有多少精度?提示:尝试'System.out.println(Float.toHexString(V1));'和'System.out.println(Float.toHexString(V2));'''你可以使用'double'作为'y', ' V1'和'V2'(但是'double'也缺乏无限精度)。 –