1. 程式人生 > >float與double精度丟失問題

float與double精度丟失問題

解決一個價格轉換顯示的bug double a=Double.parseDouble(3.80); long price=new Double(a*100).longValue();結果是3.799999999.......大部分程式設計師都知道浮點型別不能用來做精確表示和運算,對根本原因能隨口說來的可能並不多,藉著這次機會,把涉及到計算機原理的知識點剖析下。出現上述結果的根本原因是計算機使用二進位制01無法準確表示某些帶小數位的十進位制資料十進位制資料轉換成二進位制資料,需經過如下計算:1、整數部分 用該整數連續除以2,取餘數,商再除以2,直到商等於0為止,最後把得到的餘數按相反的順序排列,即“除2取餘法”2、小數部分 小數部分“乘2取整,順序排列”法,小數部分乘以2,從乘積中取整數部分,剩餘的小數部分乘以2,再把乘積的整部部分取出,剩餘的小數部分乘以2,直到乘積中的小數部分為0或達到所要求的精度為止,把取出的整數部分順序排列,即“乘2取整法”。3、相加 最後把整數部分和小數部分相加,得到二進位制資料例如:十進位制的3.8轉換成二進位制數值,步驟如下:3(整數部分)3/2=1................11/2=0.................1十進位制3 轉換為二進位制 110.8(小數部分)0.8*2=1.6................10.6*2=1.2.................10.2*2=0.4.................00.4*2=0.8.................00.8*2=1.6................1....十進位制0.8 轉換為二進位制 (0.11001100.....) 後邊無限迴圈1100這段二進位制數值,因此也就出現了上述的3.799999的情況。java 的浮點型別都依據 IEEE 754 標準。IEEE 754 定義了32 位和 64 位雙精度兩種浮點二進位制小數標準。IEEE 754 用科學記數法以底數為 2 的小數來表示浮點數。32 位浮點數用 1 位表示數字的符號,用 8 位來表示指數,用 23位來表示尾數,即小數部分。作為有符號整數的指數可以有正負之分。小數部分用二進位制(底數 2 )小數來表示。對於64位雙精度浮點數,用 1 位表示數字的符號,用 11 位表示指數,52 位表示尾數。在 IEEE 754 的 double 沒有辦法表示出 0.8,只能得到一個近似值。float和double只能用來做科學計算或者是工程計算,在商業計算等精確計算中,用java.math.BigDecimal。BigDecimal的解決方案就是,不使用二進位制,而是使用十進位制(BigInteger)+小數點位置(scale)來表示小數。
上述的39.8=398 * 0.1^1 這種表示方式下,避免了小數的出現,就不會有精度問題了。

相關推薦

floatdouble精度丟失問題

解決一個價格轉換顯示的bug double a=Double.parseDouble(3.80); long price=new Double(a*100).longValue();結果是3.799999999.......大部分程

對於doublefloat型別運算精度丟失,請使用BigDecimal

一、簡介 Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變數double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。float和double只能用來做科學計算或者是工程計算,在商業計算中要用java.m

floatdouble的範圍和精度

http://blog.csdn.net/dxy612/article/details/5518477 1 範圍 float和double的範圍是由指數的位數來決定的。 float的指數位有8位,而double的指數位有11位,分佈如下: float: 1bit(符號

C++中floatdouble型別的精度區別

double精度高,有效數字15-16位,float精度低,有效數字6-7位,但是double消耗的記憶體是float的兩倍,運算速度比float慢得多,建議能用float保證精度的就用float,少用double。 #include <iostream> #

float double類型範圍和精度

1 範圍 float和double的範圍是由指數的位數來決定的。 float的指數位有8位,而double的指數位有11位,分佈如下: float: 1bit(符號位) 8bits(指數位) 23bits(尾數位) double: 1bit(符號位)

float double型數據存儲---IEEE浮點數表示法

0.12 理解 float 標準 顯示 運算 details .com c/c++ 目前C/C++編譯器標準都遵照IEEE制定的浮點數表示法來進行float,double運算。 這種結構是一種科學計數法,用符號、指數和尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2

floatdouble精度

Double與float型別 (1)基本儲存方式:與int、long儲存方式不同,double與float在記憶體中是以符號位、指數位與尾數位三部分進行儲存的,其中符號位表示數字分正負,佔位1位;指數位表示浮點的位置,佔位8位,無符號儲存,取值範圍:0-256,其與實際指數的偏差值為127,

java floatdouble精度問題

private static void testDouble() { double a = 0.05+0.01; float b = 0.05f+0.01f; System.out.println(a); S

Java中不同數值型別間轉換計算精度丟失問題

在Java程式設計過程中,經常會涉及到不同數值型別之間的計算問題,例如: int m=6; float n=3.5f; double p=2.75d; System.out.println(m + n); System.out.println(n

floatdouble型別區別比較

單精度浮點數在機內佔4個位元組,用32位二進位制描述。 雙精度浮點數在機內佔8個位元組,用64位二進位制描述。浮點數在機內用指數型式表示,分解為:數符,尾數,指數符,指數四部分。數符佔1位二進位制,表示數的正負。指數符佔1位二進位制,表示指數的正負。尾數表示浮點數有效數字

floatdouble的區別,以及float為什麼要加f

單精度浮點數(float)與雙精度浮點數(double)的區別如下:(1)在記憶體中佔有的位元組數不同單精度浮點數(float)在機內佔4個位元組雙精度浮點數(double)在機內佔8個位元組(2)有效數字位數不同單精度浮點數(float)有效數字8位雙精度浮點數(doubl

JAVA基本資料類型範圍和floatdouble精度問題

1.八中資料型別的分類如下:  第一類:整型 byte short int long 第二類:浮點型 float double 第三類:邏輯型 boolean(它只有兩個值可取true false)

float,double精度丟失問題

idt multipl sof zh-cn hid lose 減法 add hide 問題提出:   12.0f-11.9f = 0.10000038,"減不盡"為什麽?   8888.88*100 = 888887.9999999999 ??? 來自MSDN的解釋:h

單精度浮點數(float精度浮點數(double)的區別:

1、單精度,也就是 float ,在 32 位機器上用 4 個位元組來儲存的;而雙精度double是用 8 個位元組來儲存的,這是他們最本質的區別。  2、由於儲存位不同,8位,16位他們能表示的數值的範圍就不同,也就是能準確表示的數的位數就不同。 單精度浮點的表示範圍:-3.40E+38

doublefloat型別進行運算造成精度丟失的問題解決

在操作的過程中,我們無意中會造成精度丟失。遇到這個問題我們進行如何解決呢?大家不要慌,本文是來介紹精度丟失的問題。 我們來看一下如下的程式碼: double price1 = 10.01d; double price2 =

[轉載]float,double精度丟失問題

問題提出:12.0f-11.9f=0.10000038,"減不盡"為什麼? 來自MSDN的解釋: 為何浮點數可能丟失精度浮點十進位制值通常沒有完全相同的二進位制表示形式。 這是 CPU 所採用的浮點資料表示形式的副作用。 為此,可能會經歷一些精度丟失,並且一些浮點

【GreenDao學習筆記】SQLite資料庫儲存float/double小數型別精度丟失

       用GreenDao工具來操作資料庫明顯提高了開發效率,但是也會出現一些小問題,比如儲存小數的時候,加加減減總無可避免精度不準,SQLite的資料型別只有這麼幾種(參考:https://www.sqlite.org/datatype3.html)。BigDecim

關於Java中用Double型運算時精度丟失的問題

左右 數字 col cto into lam 決定 action 簡化 註:轉自 https://blog.csdn.net/bleach_kids/article/details/49129943 在使用Java,double 進行運算時,經常出現精度丟失的問題,總是在

關於floatdouble計算精度缺失解決方法筆記

最近在專案中的財務管理模組遇到一個問題就是資料庫欄位建的型別是float,在計算後會引起精度缺失問題 拋開資料庫建立的不當以外,遇到這個問題的解決方法如下: 例子: public static void main(String[] args) { // TODO Auto-gene

Unity,C# float轉String如何保留實際小數位數,即防止精度丟失擷取字串報錯

比如一個float a = 329.0; 轉成String,要讓a顯示成329.0;如果a = 329.000,轉成String 顯示成329.000 可是實際卻不是這樣的 a.ToString()直接變成329 所以碰到這種情況怎麼辦呢 一. string Dat