成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官瘋了嗎,問我為什么浮點數不精確?

開發 開發工具
很多人都知道,Java 中的浮點數并不精確,需要用 BigDecimal進行精確計算,但是,很少有人知道為什么浮點數不精確呢?不精確為什么還要用呢?本文就來展開分析一波。

[[434999]]

很多人都知道,Java 中的浮點數并不精確,需要用 BigDecimal進行精確計算,但是,很少有人知道為什么浮點數不精確呢?不精確為什么還要用呢?本文就來展開分析一波。

我們知道,計算機的數字的存儲和運算都是通過二進制進行的,對于,十進制整數轉換為二進制整數采用"除2取余,逆序排列法。

具體做法是:

  • 用2整除十進制整數,可以得到一個商和余數;
  • 再用2去除商,又會得到一個商和余數,如此進行,直到商為小于1時為止
  • 然后把先得到的余數作為二進制數的低位有效位,后得到的余數作為二進制數的高位有效位,依次排列起來。

如,我們想要把127轉換成二進制,做法如下:

那么,十進制小數轉換成二進制小數,又該如何計算呢?

十進制小數轉換成二進制小數采用"乘2取整,順序排列"法。

具體做法是:

  • 用2乘十進制小數,可以得到積
  • 將積的整數部分取出,再用2乘余下的小數部分,又得到一個積
  • 再將積的整數部分取出,如此進行,直到積中的小數部分為零,此時0或1為二進制的最后一位。或者達到所要求的精度為止。

如嘗試將0.625轉成二進制:

但是0.625是一個特列,用同樣的算法,請計算下0.1對應的二進制是多少:

我們發現,0.1的二進制表示中出現了無限循環的情況,也就是(0.1)10 = (0.000110011001100…)2

這種情況,計算機就沒辦法用二進制精確的表示0.1了。

所以,為了解決部分小數無法使用二進制精確表示的問題,于是就有了IEEE 754規范。

IEEE二進制浮點數算術標準(IEEE 754)是20世紀80年代以來最廣泛使用的浮點數運算標準,為許多CPU與浮點運算器所采用。

浮點數和小數并不是完全一樣的,計算機中小數的表示法,其實有定點和浮點兩種。因為在位數相同的情況下,定點數的表示范圍要比浮點數小。所以在計算機科學中,使用浮點數來表示實數的近似值。

IEEE 754規定了四種表示浮點數值的方式:單精確度(32位)、雙精確度(64位)、延伸單精確度(43比特以上,很少使用)與延伸雙精確度(79比特以上,通常以80位實現)。

其中最常用的就是32位單精度浮點數和64位雙精度浮點數。

單精度浮點數在計算機存儲器中占用4個字節(32 bits),利用“浮點”(浮動小數點)的方法,可以表示一個范圍很大的數值。

比起單精度浮點數,雙精度浮點數(double)使用 64 位(8字節) 來存儲一個浮點數。

IEEE并沒有解決小數無法精確表示的問題,只是提出了一種使用近似值表示小數的方式,并且引入了精度的概念。

一個浮點數a由兩個數m和e來表示:a = m × b^e。

在任意一個這樣的系統中,我們選擇一個基數b(記數系統的基)和精度p(即使用多少位來存儲)。m(即尾數)是形如±d.ddd…ddd的p位數(每一位是一個介于0到b-1之間的整數,包括0和b-1)。

如果m的第一位是非0整數,m稱作規格化的。有一些描述使用一個單獨的符號位(s 代表+或者-)來表示正負,這樣m必須是正的。e是指數。

最后,由于計算機中保存的小數其實是十進制的小數的近似值,并不是準確值,所以,千萬不要在代碼中使用浮點數來表示金額等重要的指標。 

建議使用BigDecimal或者Long(單位為分)來表示金額。

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2021-12-02 08:19:06

MVCC面試數據庫

2021-06-03 08:55:54

分布式事務ACID

2020-09-15 12:57:46

C 語言浮點數內存

2022-07-19 07:02:47

JVMGC分代收集

2022-07-06 13:48:24

RedisSentinel機制

2023-12-06 09:10:28

JWT微服務

2020-04-16 08:22:11

HTTPS加解密協議

2021-05-20 08:54:16

Go面向對象

2010-08-23 15:06:52

發問

2022-05-24 08:03:28

InnoDBMySQL數據

2020-10-24 15:50:54

Java值傳遞代碼

2021-02-19 10:02:57

HTTPSJava安全

2023-07-05 08:00:58

Redis數據庫

2021-01-21 07:53:29

面試官Promis打印e

2021-10-25 08:49:32

索引數據庫MySQL

2020-06-22 11:50:38

TCPIP協議

2021-12-20 10:30:33

forforEach前端

2017-10-16 10:42:27

前端JavaScript浮點數

2023-12-20 14:35:37

Java虛擬線程

2023-06-20 12:02:39

WhileFor(;;)
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 最近中文字幕第一页 | 久精品视频 | 国产网站久久 | 欧美一区永久视频免费观看 | 国产福利在线看 | 久久99深爱久久99精品 | 中文字幕国产一区 | 国产精品区二区三区日本 | www国产精品 | 色综合视频 | 欧美精品一区三区 | 久久成人免费视频 | 成人精品久久久 | 亚洲国产精品99久久久久久久久 | 三级成人在线 | 日本在线中文 | 日韩欧美三级 | 久久久久久久久久久久久九 | 日本三级电影在线观看视频 | 亚洲av毛片 | 国产精品一区二区精品 | 日本欧美在线观看视频 | 在线观看中文字幕视频 | 天天操操 | 国产精品一区二区电影 | 亚洲一区中文字幕 | 欧美日韩一区精品 | 伊人二区| 国产一区二区三区四区五区加勒比 | 麻豆视频在线免费观看 | 玖玖在线精品 | 国产精品精品久久久久久 | 欧美日韩亚洲视频 | 亚洲福利在线视频 | 伊人久久精品一区二区三区 | 99视频| 狠狠的日 | 国产精品久久精品 | 精品国产第一区二区三区 | 亚洲精品无 | 欧美男人天堂 |