這擴大一點在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'也缺乏無限精度)。 –