java 為何浮點數(shù)可能丟失精度?
為何浮點數(shù)可能丟失精度?并不是說Java浮點數(shù)的精度會丟失,而是存儲在二進制中的所有浮點數(shù)都可能會丟失精度(有些特殊的十進制值可以精確表示),所以存儲在計算機中的浮點數(shù)有丟失精度的風險,但是丟失的精度
為何浮點數(shù)可能丟失精度?
并不是說Java浮點數(shù)的精度會丟失,而是存儲在二進制中的所有浮點數(shù)都可能會丟失精度(有些特殊的十進制值可以精確表示),所以存儲在計算機中的浮點數(shù)有丟失精度的風險,但是丟失的精度不會影響我們的正常使用。當小數(shù)轉(zhuǎn)換成二進制時,它們不一定用精確的二進制來表示,大多數(shù)情況下它們被當作近似值,這會導致精度的損失。如果用二進制進行計算,顯然會進一步損失計算結果的準確性。舉個簡單的例子,0.1用二進制表示(十進制和二進制轉(zhuǎn)換法)(1)0.1×2=0.2,0.0(2)0.2×2=0.4,0.00(3)0.4×2=0.8,0.000(4)0.8×2=1.6,0.0001(5)0.6×2=0.2,0.00011(6)0.2×2=0.4,0.000110(7)0.4×2=0.8取整數(shù)0得到0.0001100(8)0.8×2=1.6取整數(shù)1得到0.00011001(9)0.6x 2=1.2取整數(shù)1得到0.000110011(n)。。。得到一個無限循環(huán)的二進制十進制0.000110011沒有辦法用一個精確的二進制來表示0.1。而且計算機中用來存儲浮點數(shù)的位數(shù)也是有限的,所以我們只能選擇以一定的精度保存。當然,也有特殊的小數(shù),比如二進制0.25就是0.01
單精度有1個符號,8個指數(shù)和23位小數(shù)。
雙精度是1號,11指數(shù),52十進制。
單精度十進制在計算機中只有23位(二進制),轉(zhuǎn)換成十進制只能保證6位十進制數(shù)字的精度。超過此精度的十進制運算(二進制23,十進制6)將被截取,導致精度損失和計算結果不準確。
同樣,雙精度,十進制是52(二進制),轉(zhuǎn)換成十進制只能保證15。
Java中單精度和雙精度浮點有什么區(qū)別?
Float占用4個字節(jié),精度為7位,而double占用8個字節(jié),精度為16位。但是,內(nèi)存消耗很大。如何使用取決于實際需要。如果你只是學習Java,你不需要深入了解它,以免陷入困境。如果你深入學習,問問度娘。