日韩性视频-久久久蜜桃-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--小数的二进制表示的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产精品久久久久桃色tv | 亚洲人成色777777老人头 | 大地资源在线观看免费高清版粤语 | 国产综合无码一区二区色蜜蜜 | 免费视频毛片 | 中文高清av| 亚洲日本免费 | 黄色污污视频网站 | 久久午夜影视 | 日本黄色成人 | 岛国大片在线 | www.国产一区二区三区 | 中文国产字幕 | 免费国产一区二区三区 | 麻豆观看 | 日韩一级影院 | www.99av| 一区二区视频在线免费观看 | 日日碰日日摸 | 午夜影院在线看 | 麻豆国产精品一区 | 日韩av一区二区在线播放 | 大香蕉视频一区二区 | 成人免费看类便视频 | www.五月天婷婷.com | 性久久久久久久久久久久 | 天天av天天翘 | 日本三级一区 | 1515hh成人免费看 | 免费播放毛片 | 国产又黄又粗的视频 | 亚洲色图清纯唯美 | 日韩精品在线免费观看视频 | 中文字幕+乱码+中文字幕一区 | a天堂v | 中文字幕xxx | 同心兄弟| 亚洲a在线播放 | 91亚洲精品乱码久久久久久蜜桃 | 国产日本亚洲 | 国产精品电影院 | 香蕉视频官网 | 不卡av在线 | 伊人色婷婷 | 日韩精品免费播放 | 熟妇人妻系列aⅴ无码专区友真希 | 黄色av网站网址 | 尤物视频免费在线观看 | 国产日产精品一区 | 色视频综合 | 亚洲欧美天堂 | 三女警花合力承欢猎艳都市h | 国产亚洲天堂网 | 亚洲精品视频大全 | 亚洲成a人片在线www | 小视频国产 | 三年大片在线观看 | 免费视频99 | 国产欧美在线一区 | 日本体内she精高潮 男女视频在线免费观看 | 成年人性视频 | 夜色88v精品国产亚洲 | 成年人视频免费在线观看 | 高清在线一区二区三区 | 免费网站在线高清观看 | 91在线观看 | 色午夜视频 | 日韩伊人网 | 欧美三区在线观看 | 手机免费看av片 | 国产一区二区三区免费看 | 久久久久人妻一区二区三区 | 日本成人中文字幕 | 91打屁股| 成人毛片在线视频 | 狠狠躁18三区二区一区视频 | wwwxxxx在线观看 | 日本一区视频 | 毛片毛片女人毛片毛片 | 欧美乱论 | 亚洲视频网站在线观看 | 精品少妇人妻av免费久久洗澡 | 日韩三级麻豆 | 麻豆乱码国产一区二区三区 | 日韩毛片无码永久免费看 | 亚洲免费av在线 | av无码精品一区二区三区宅噜噜 | 国产99视频在线观看 | 中国a级大片 | 吻胸摸激情床激烈视频 | 免费h片在线观看 | 大吊一区二区三区 | 黄色三级带 | 亚洲性视频在线 | 美女一区二区三区四区 | 精品人妻一区二区三区蜜桃 | 精品久久久久久久久久久国产字幕 | 欧美日韩天堂 | 成人黄色免费视频 |