日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java二进制小数表示_《Java编程的逻辑》笔记9--小数的二进制表示

發布時間:2025/3/15 java 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java二进制小数表示_《Java编程的逻辑》笔记9--小数的二进制表示 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

小數計算為什么會出錯?

簡要答案

實際上,不是運算本身會出錯,而是計算機根本就不能精確的表示很多數,比如0.1這個數。

計算機是用一種二進制格式存儲小數的,這個二進制格式不能精確表示0.1,它只能表示一個非常接近0.1但又不等于0.1的一個數。

數字都不能精確表示,在不精確數字上的運算結果不精確也就不足為奇了。

0.1怎么會不能精確表示呢?在十進制的世界里是可以的,但在二進制的世界里不行。在說二進制之前,我們先來看下熟悉的十進制。

實際上,十進制也只能表示那些可以表述為10的多少次方和的數,比如12.345,實際上表示的:110 21 30.1 40.01 5*0.001,與整數的表示類似,小數點后面的每個位置也都有一個位權,從左到右,依次為 0.1,0.01,0.001,…即10^(-1), 10^(-2), 10^(-3)。

很多數,十進制也是不能精確表示的,比如1/3, 保留三位小數的話,十進制表示是0.333,但無論后面保留多少位小數,都是不精確的,用0.333進行運算,比如乘以3,期望結果是1,但實際上卻是0.999。

二進制是類似的,但二進制只能表示哪些可以表述為2的多少次方和的數,來看下2的次方的一些例子:

可以精確表示為2的某次方之和的數可以精確表示,其他數則不能精確表示。

為什么一定要用二進制呢?

為什么就不能用我們熟悉的十進制呢?在最最底層,計算機使用的電子元器件只能表示兩個狀態,通常是低壓和高壓,對應0和1,使用二進制容易基于這些電子器件構建硬件設備和進行運算。如果非要使用十進制,則這些硬件就會復雜很多,并且效率低下。

#為什么有的小數計算是準確的

如果你編寫程序進行試驗,你會發現有的計算結果是準確的。比如,我用Java寫:

System.out.println(0.1f 0.1f);

System.out.println(0.1f*0.1f);

第一行輸出0.2,第二行輸出0.010000001。按照上面的說法,第一行的結果應該也不對啊?

其實,這只是Java語言給我們造成的假象,計算結果其實也是不精確的,但是由于結果和0.2足夠接近,在輸出的時候,Java選擇了輸出0.2這個看上去非常精簡的數字,而不是一個中間有很多0的小數。

在誤差足夠小的時候,結果看上去是精確的,但不精確其實才是常態。

怎么處理計算不精確

計算不精確,怎么辦呢?大部分情況下,我們不需要那么高的精度,可以四舍五入,或者在輸出的時候只保留固定個數的小數位。

如果真的需要比較高的精度,一種方法是將小數轉化為整數進行運算,運算結束后再轉化為小數,另外的方法一般是使用十進制的數據類型,這個沒有統一的規范,在Java中是BigDecimal,運算更準確,但效率比較低,本節就不詳細說了。

二進制表示

我們之前一直在用"小數"這個詞表示float和double類型,其實,這是不嚴謹的,“小數"是在數學中用的詞,在計算機中,我們一般說的是"浮點數”。float和double被稱為浮點數據類型,小數運算被稱為浮點運算。

為什么要叫浮點數呢?這是由于小數的二進制表示中,表示那個小數點的時候,點不是固定的,而是浮動的。

我們還是用10進制類比,10進制有科學表示法,比如123.45這個數,直接這么寫,就是固定表示法,如果用科學表示法,在小數點前只保留一位數字,可以寫為1.2345E2即1.2345*(10^2),即在科學表示法中,小數點向左浮動了兩位。

二進制中為表示小數,也采用類似的科學表示法,形如 m*(2^e)。m稱為尾數,e稱為指數。指數可以為真,也可以為負,負的指數表示哪些接近0的比較小的數。在二進制中,單獨表示尾數部分和指數部分,另外還有一個符號位表示正負。

幾乎所有的硬件和編程語言表示小數的二進制格式都是一樣的,這種格式是一個標準,叫做IEEE 754標準,它定義了兩種格式,一種是32位的,對應于Java的float,另一種是64位的,對應于Java的double。

32位格式中,1位表示符號,23位表示尾數,8位表示指數。64位格式中,1位表示符號,52位表示尾數,11位表示指數。

在兩種格式中,除了表示正常的數,標準還規定了一些特殊的二進制形式表示一些特殊的值,比如負無窮,正無窮,0,NaN (非數值,比如0乘以無窮大)。

IEEE 754標準有一些復雜的細節,初次看上去難以理解,對于日常應用也不常用,本文就不介紹了。

如果你想查看浮點數的具體二進制形式,在Java中,可以使用如下代碼:

Integer.toBinaryString(Float.floatToIntBits(value))

Long.toBinaryString(Double.doubleToLongBits(value));

寫在最后

https://www.icode9.com/content-1-357901.html

總結

以上是生活随笔為你收集整理的Java二进制小数表示_《Java编程的逻辑》笔记9--小数的二进制表示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一区二区三区免费观看视频 | 日本黄大片在线观看 | 亚洲成人影音 | 五月婷色| 成人免费黄色大片v266 | 日本一区二区三区在线观看 | 免费91视频| 一区二区精品视频在线观看 | 在线观看视频中文字幕 | 亚洲视频手机在线观看 | 亚洲香蕉在线 | 丰满少妇高潮在线观看 | 日韩少妇内射免费播放18禁裸乳 | 制服丝袜一区二区三区 | 婷婷久久伊人 | 久久久久久久久电影 | 少妇紧身牛仔裤裤啪啪 | 777精品久无码人妻蜜桃 | 男人天堂1024 | 国产91一区二区三区在线精品 | 国产在线精| 亚洲视频小说 | 成人网导航| 日韩在线观看网址 | 粗大的内捧猛烈进出视频 | www.成人精品| 一本色道久久加勒比精品 | 邵氏电影《金莲外传2》免费观看 | 婷婷久久精品 | 一区二区三区四区在线免费观看 | 久久久久久久黄色 | 福利资源在线观看 | 黄色污在线观看 | 成人三级黄色片 | www.国产毛片 | 星空大象mv高清在线观看免费 | 久久久天堂 | 久久综合色88 | av尤物在线 | 99香蕉视频 | 黄视频免费在线看 | 国产黄av| 一本—道久久a久久精品蜜桃 | 色狠狠综合网 | 久久国语精品 | 亚洲天堂av免费在线观看 | 操伊人| 日韩污视频在线观看 | 中文字幕在线观看1 | 午夜一区二区三区免费观看 | 日本不卡中文字幕 | 黄色av中文字幕 | 国产精美视频 | 就要操av| www.午夜视频 | 欧美成人专区 | 在线播放你懂的 | 俺来也俺也啪www色 欧洲一区二区视频 | 97福利| av片子在线观看 | 一二三不卡视频 | 国产一级理论片 | 免费特黄视频 | 中日韩在线观看 | 国产精品日韩av | 久久久欧美精品sm网站 | 国产麻豆精品久久一二三 | 在线视频这里只有精品 | 日韩欧美一区二区视频 | 天天撸天天操 | 欧美日韩亚洲一区二区三区 | 亚洲欧美日韩国产综合 | 欧美三级网站 | 日韩欧美高清在线视频 | 在线观看波多野结衣 | 国产四区视频 | 永久免费AV无码网站韩国毛片 | 99热偷拍| 亚洲日本色图 | 男人天堂怡红院 | 黄色在线a| 久久爱综合网 | 在线播放色 | 国产精品高潮呻吟久久 | 乐播av一区二区三区 | 老妇裸体性猛交视频 | 国内偷拍第一页 | 国产毛片精品国产一区二区三区 | 伊人影院久久 | 免费欧美| 猛1被调教成公厕尿便失禁网站 | 69精品在线 | 亚洲AV无码片久久精品 | 东北女人啪啪ⅹxx对白 | 9i看片成人免费看片 | 五月天视频网 | 色亭亭| 婷婷综合国产 | 亚洲a人|