3 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
我發(fā)現(xiàn)轉(zhuǎn)換為二進(jìn)制表示更容易理解這個(gè)問(wèn)題。
float f = 0.27f;
double d2 = (double) f;
double d3 = 0.27d;
System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(f)));
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d2)));
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d3)));
您可以通過(guò)向末尾添加0來(lái)看到float擴(kuò)展為double,但是0.27的雙重表示“更準(zhǔn)確”,因此問(wèn)題。
111110100010100011110101110001
11111111010001010001111010111000100000000000000000000000000000
11111111010001010001111010111000010100011110101110000101001000

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是由于合同Float.toString(float)
,部分說(shuō):
小數(shù)部分必須打印多少位數(shù)[...]?必須至少有一個(gè)數(shù)字來(lái)表示小數(shù)部分,并且除此之外必須有多個(gè),但只有多少個(gè), 更多的數(shù)字才能唯一地將參數(shù)值與float類型的相鄰值區(qū)分開來(lái)。也就是說(shuō),假設(shè)x是由此方法為有限非零參數(shù)f生成的十進(jìn)制表示所表示的精確數(shù)學(xué)值。那么f必須是最接近x的浮點(diǎn)值; 或者,如果兩個(gè)浮點(diǎn)值等于x,則f必須是其中之一,f的有效位的最低有效位必須為0。
添加回答
舉報(bào)