Java中的浮點(diǎn)數(shù)分析
浮點(diǎn)數(shù)分為單精度和雙精度,Java中的單精度和雙精度分別為float和double.你們知道float和double是怎么存儲(chǔ)的嗎?
float占4個(gè)字節(jié),double占8個(gè)字節(jié),為了方便起見,這里就只討論float類型.
float其實(shí)和一個(gè)int型的大小是一樣的,一共32位,第一位表示符號(hào),2-9表示指數(shù),后面23位表示小數(shù)部分.這里不多說,請(qǐng)參考:http://blog.csdn.net/treeroot/archive/2004/09/05/95071.aspx
這里只舉一個(gè)例子,希望能拋磚引玉,就是研究一下浮點(diǎn)數(shù)0.1的存儲(chǔ)形式,先運(yùn)行這個(gè)程序.
| public class Test{ public static void main(String[] args) { int x = 0x3d800000; int i = 1 << 22; int j = 1 << 4; float f = 0.1f; int y = Float.floatToIntBits(f); float rest = f - ( (float) 1) / j; while (i > 0) { static void pr(int i) { } |
結(jié)果:
111101110011001100110011001101
111101110011001100110011001101
程序說明:
int x=0x3d80000;
因?yàn)楦↑c(diǎn)表示形式為1.f*2n-127我們要表示0.1,可以知道n-127=-4,到n=123
符號(hào)為正,可知前9是 001111011,暫時(shí)不考慮后面的23位小數(shù),所以我們先假設(shè)x=0x3d800000;
| int i = 1 << 22; |
| int j = 1 << 4; |
i初始為4,因?yàn)閚-127為-4,這里是為了求它的倒數(shù).
| float f = 0.1f; int y = Float.floatToIntBits(f); |
y就是它的32位表示
| float rest = f - ( (float) 1) / j; |
這個(gè)rest表示除了1.f中的1剩下的,也就是0.f
| while (i > 0) { j <<= 1; float deta = ( (float) 1) / j; if (rest >= deta) { rest -= deta; x |= i; } i >>= 1; } |
這個(gè)循環(huán)來計(jì)算23位小數(shù)部分,如果rest不小于deta,表示這個(gè)位可以置為1.
其他的不多說了,輸入結(jié)果是一樣的,可以說0.1這個(gè)浮點(diǎn)數(shù)肯定是不精確的,但是0.5可以精確的表示,想想為什么吧
- Java使用BigDecimal精確運(yùn)算浮點(diǎn)數(shù)
- java.math包下計(jì)算浮點(diǎn)數(shù)和整數(shù)的類的實(shí)例
- Java判斷字符串是否是整數(shù)或者浮點(diǎn)數(shù)的方法
- JAVA浮點(diǎn)數(shù)計(jì)算精度損失底層原理與解決方案
- Java中浮點(diǎn)數(shù)精度問題的解決方法
- Java中使用BigDecimal進(jìn)行浮點(diǎn)數(shù)運(yùn)算
- java大數(shù)乘法的簡單實(shí)現(xiàn) 浮點(diǎn)數(shù)乘法運(yùn)算
- java實(shí)現(xiàn)浮點(diǎn)數(shù)轉(zhuǎn)人民幣的小例子
- Java正確比較浮點(diǎn)數(shù)的方法
相關(guān)文章
java實(shí)現(xiàn)短信驗(yàn)證碼5分鐘有效時(shí)間
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)短信驗(yàn)證碼5分鐘有效時(shí)間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Java實(shí)現(xiàn)設(shè)計(jì)模式之責(zé)任鏈模式
責(zé)任鏈模式是一種行為設(shè)計(jì)模式,允許你將請(qǐng)求沿著處理鏈發(fā)送,然后處理者都可對(duì)其進(jìn)行處理,完成后可以再將其傳遞給下一個(gè)處理者。下面將會(huì)舉例說明什么是責(zé)任鏈模式,責(zé)任鏈模式該如何使用2022-08-08
java多線程編程之慎重使用volatile關(guān)鍵字
volatile關(guān)鍵字相信了解Java多線程的讀者都很清楚它的作用。volatile關(guān)鍵字用于聲明簡單類型變量,下面看一下為什么要慎重使用volatile關(guān)鍵字2014-01-01
MAC上IntelliJ IDEA的svn無法保存密碼解決方案
今天小編就為大家分享一篇關(guān)于MAC上IntelliJ IDEA的svn無法保存密碼解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10
關(guān)于Selenium的UI自動(dòng)化測試屏幕截圖功能實(shí)例代碼
今天小編就為大家分享一篇關(guān)于Selenium的UI自動(dòng)化測試屏幕截圖功能實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Java?限制前端重復(fù)請(qǐng)求的實(shí)例代碼
這篇文章主要介紹了Java?限制前端重復(fù)請(qǐng)求,文中給大家提到了JAVA利用自定義本地鎖解決重復(fù)提交的問題,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
在CentOS上安裝Java 17并實(shí)現(xiàn)多版本共存的詳細(xì)教程
在現(xiàn)代軟件開發(fā)中,Java 作為一種廣泛使用的編程語言,其版本更新頻繁,不同項(xiàng)目可能依賴不同版本的 Java 運(yùn)行環(huán)境,CentOS 作為一款流行的 Linux 發(fā)行版,常被用于服務(wù)器部署和開發(fā)環(huán)境,本文將詳細(xì)介紹如何在 CentOS 上安裝 Java 17,并實(shí)現(xiàn)與現(xiàn)有 Java 8 的多版本共存2025-03-03

