Java中float類型的范圍及其與十六進(jìn)制的轉(zhuǎn)換例子
float占用4個字節(jié),和int是一樣,也就是32bit。
第1個bit表示符號,0表示正數(shù),1表示負(fù)數(shù),這個很好理解,不用多管。
第2-9個bit表示指數(shù),一共8為(可以表示0-255),這里的底數(shù)是2,為了同時表示正數(shù)和負(fù)數(shù),這里要減去127的偏移量。這樣的話范圍就是(-127到128),另外全0和全1作為特殊處理,所以直接表示-126到127。
剩下的23位表示小數(shù)部分,這里23位表示了24位的數(shù)字,因?yàn)橛幸粋€默認(rèn)的前導(dǎo)1(只有二進(jìn)制才有這個特性)。
最后結(jié)果是:(-1)^(sign) * 1。f * 2^(exponent)
這里:sign是符號位,f是23bit的小數(shù)部分,exponent是指數(shù)部分,最后表示范圍是(因?yàn)檎?fù)數(shù)是對稱的,這里只關(guān)心正數(shù))
2^(-126) ~~ 2(1-2^(-24)) * 2^127
這個還不是float的取值范圍,因?yàn)闃?biāo)準(zhǔn)中還規(guī)定了非規(guī)格化表示法,另外還有一些特殊規(guī)定。
非規(guī)格化表示:
當(dāng)指數(shù)部分全0而且小數(shù)部分不全0時表示的是非規(guī)格化的浮點(diǎn)數(shù),因?yàn)檫@里默認(rèn)沒有前導(dǎo)1,而是0。
取值位0。f * 2^(-126),表示范圍位 2^(-149)~~ (1-2^(-23)) * 2^(-126) 這里沒有考慮符號。這里為什么是-126而不是-127? 如果是-127的話,那么最大表示為
2^(-127)-2^(-149),很顯然2^(-127) ~~2^(-126) 就沒法表示了。
其他特殊表示
1。當(dāng)指數(shù)部分和小數(shù)部分全為0時,表示0值,有+0和-0之分(符號位決定),0x00000000表示正0,0x80000000表示負(fù)0。
2。指數(shù)部分全1,小數(shù)部分全0時,表示無窮大,有正無窮和負(fù)無窮,0x7f800000表示正無窮,0xff800000表示負(fù)無窮。
3。指數(shù)部分全1,小數(shù)部分不全0時,表示NaN,分為QNaN和SNaN,Java中都是NaN。
結(jié)論:
可以看出浮點(diǎn)數(shù)的取值范圍是:2^(-149)~~(2-2^(-23))*2^127,也就是Float。MIN_VALUE和Float。MAX_VALUE。
PS:float轉(zhuǎn)16進(jìn)制,16進(jìn)制轉(zhuǎn)float
package com.sondon.dev_soceket.test;
/**
* @Project : 硬件通訊
* @Package : com.sondon.tcpip
* @Class : Test.java
* @Company 廣州訊動網(wǎng)絡(luò)科技有限公司
* @Author : 蔡文鋒
* @DateTime:2015年4月2日 上午11:21:53
* @Blog:http://blog.csdn.net/caiwenfeng_for_23
* @Description : { 測試 }
*/
public class Test {
public static void main(String[] args) {
String s="3E1E9E9F";
Float value = Float.intBitsToFloat(Integer.valueOf(s.trim(), 16));
System.out.println(value);
Float f=0.15490197f;
System.out.println(Integer.toHexString(Float.floatToIntBits(f)));
}
}
相關(guān)文章
使用GSON庫轉(zhuǎn)換Java對象為JSON對象的進(jìn)階實(shí)例詳解
這篇文章主要介紹了使用GSON庫轉(zhuǎn)換Java對象為JSON對象的進(jìn)階實(shí)例詳解,包括注冊TypeAdapter及處理Enum類型等實(shí)際運(yùn)用中可能遇到的一些復(fù)雜問題,需要的朋友可以參考下2016-06-06
SpringBoot開發(fā)案例之配置Druid數(shù)據(jù)庫連接池的示例
本篇文章主要介紹了SpringBoot開發(fā)案例之配置Druid數(shù)據(jù)庫連接池的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
Mybatis-Plus動態(tài)表名的實(shí)現(xiàn)示例
面對復(fù)雜多變的業(yè)務(wù)需求,動態(tài)表名的處理變得愈發(fā)重要,本文主要介紹了Mybatis-Plus動態(tài)表名的實(shí)現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-07-07
java如何實(shí)現(xiàn)多線程的順序執(zhí)行
多線程是java的一種重要技術(shù),但是多線程的運(yùn)行是沒有絕對的順序的,那么java如何實(shí)現(xiàn)多線程的順序執(zhí)行,下面就一起來了解一下2021-05-05
SpringBoot項目引入MCP的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot項目引入MCP的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04

