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

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

主站蜘蛛池模板: 五月婷网 | 色婷婷网 | 韩国短剧在线观看 | 涩涩97 | 国产视频分类 | 朝桐光av在线一区二区三区 | 国产日韩在线免费观看 | 91人妻一区二区 | 女裸全身无奶罩内裤内衣内裤 | 男女日批视频 | 对白刺激theporn | 嫩草影院在线观看视频 | 欧美视频在线播放 | 国产在线观看你懂的 | 久久av秘一区二区三区 | 国产精品2区 | 欧美a网 | 99精品视频国产 | 97人人视频 | 一区二区在线免费观看 | 国产激情视频一区 | 免费观看一区二区三区视频 | 懂色av蜜臀av粉嫩av分享吧最新章节 | 色94色欧美sute亚洲线路二 | 国模视频一区二区 | 黄床大片 | 在线色网址 | 中文字幕+乱码+中文乱码91 | 香蕉传媒 | 国产精品二区在线 | 一区二区三区精品国产 | 欧美大白屁股 | 久久噜噜色综合一区二区 | 乳色吐息免费看 | 中文字幕日韩有码 | 国产精品理论片 | 一区二区三区日韩在线 | 深夜av在线| 久久亚洲aⅴ无码精品 | 制服中文字幕 | 精品一区二区三区视频在线观看 | 高h大肚孕期孕妇play | 亚洲无人区码一码二码三码 | 日韩国产一区二区三区 | 天天色播 | 欧美视频第二页 | 国产99精品 | 爱情岛论坛自拍 | 精品国产高清在线观看 | 一区二区三区视频网站 | 黄色在线观看www | 色婷婷久久一区二区三区麻豆 | 欧美大喷水吹潮合集在线观看 | 久久99精品国产.久久久久 | 亚洲成人二区 | 久久中文字幕一区二区 | 一区二区黄色 | av字幕网 | 日韩尤物 | 秋霞综合网 | 日韩在线专区 | 欧美黄色大片网站 | 精品久久成人 | 中文字幕一二三四 | 精品国产18久久久久久 | 悠悠色影院 | 日本亚洲视频 | 色婷婷婷 | 日韩一区不卡 | 欧美成人精品一区二区三区在线看 | 欧美日韩小视频 | 一区二区三区www污污污网站 | 免费视频久久 | 波多野结衣二区三区 | 欧美激情一区二区三区免费观看 | 亚洲人免费 | 午夜免费看视频 | 国产精品一线二线 | 亚洲综合图区 | 俄罗斯女人裸体性做爰 | 天堂精品| 日本美女视频 | 中文字幕亚洲色图 | 日日噜噜夜夜爽爽 | 黄色大片网站 | 免费一级suv好看的国产网站 | 在线成人亚洲 | 国产av无码专区亚洲av毛片搜 | 免费在线观看av网站 | 不卡视频一区二区三区 | 亚洲国产免费av | 性欧美另类 | 性欧美一区 | 麻豆精品在线视频 | 欧美一区,二区 | 一本色道无码道dvd在线观看 | 狠狠澡| 麻豆射区 | 色综合久久久久 |