它不會再添加一個十進制數字 - 只是一個二進制數字。因此,而不是23位,你有24位。這很方便,因爲你無法用一個數字開頭的唯一數字是零,這是一個特殊的值。
總之,你不看2^24
(這將是一個十進制數,基數爲10) - 你正在尋找2^(-24)
。這是float
- double
和decimal
之間最重要的區別。 decimal
就是你想象的那樣,即。一個簡單的指數移位的基數爲10的數字。 float
和double
是不是。
現在,十進制數字與二進制數字是一個棘手的問題。您的錯誤理解是:精度與2^24
的數字有關 - 只有在您討論例如decimal
類型,它實際上存儲十進制值作爲正常(巨驢)整數的小數點偏移量。
就像1/3
不能用十進制寫(0.333333...
),許多簡單的十進制數不能用精確的浮點數表示(0.2
就是典型的例子)。 decimal
沒有問題 - 這只是2
向右移一位數,容易鬆動。但是,對於浮點數,您必須將此值表示爲兩個負的冪的和 - 0.5
,0.25
, 0.125
...如果2
不是10
的因子 - 每個有限二進制「十進制「可以用十進制的有限精度表示。
現在,事實上,float
可以很容易地代表一個24位十進制數字 - 它只需要2^(-24)
- 在日常工作中你不會遇到的數字,以及十進制中奇怪的數字。那麼7
(實際上更像7.22...
)從哪裏來?很簡單,只需做一個2^(-24)
的小數對數。
看起來0.2
在float
中可以「完全」表示的事實很簡單,因爲每次你把它轉換成一個字符串,你四捨五入。所以,即使這個數字不是準確的,它會以這種方式轉換成十進制數。
所有這一切意味着當你需要小數精度時,你想使用decimal
,就這麼簡單。這不是因爲它是一個更好的計算基礎,它只是因爲人們使用它,如果你的應用程序在一張紙上計算出不同的結果,他們就不會高興 - 尤其是在處理金錢時。會計師非常專注於讓一切正確到最低有效位。
浮點數用於不是十進制精度的地方,而是通常具有某種精度 - 這使得它們非常適合物理計算和類似的工作,因爲您實際上並不關心數字是否相同以十進制表示 - 您正在使用給定的精度,並且您將獲得 - 24個重要的二進制「小數」。
它沒關係 - 它是一個數字。我已經知道decimal是_decimal_浮點數vs float/double,它是_binary_浮點數。但仍然 - 都代表價值。 95%的答案解釋不相關的信息(0.333,十進制與浮點數,減去功率,人類讀取十進制.....)。 2^24 vs 2^-24,這並不重要 - 尾數的工作是提供顯着的數字。 –
@RoyiNamir浮點型尾數的工作是提供重要的*二進制*數字。 '1.1111111f.ToString(「f10」)'會給你'「1.111111」 - 「有保證的」7個十進制數字。但是,'1.1920928955078125.ToString(「f20」)'會給你17個十進制數字。你的問題很清楚你*不瞭解'decimal'和'float'之間的區別('所以我們可以代表2^23個數字(通過23位):即8388608 - >這是7位長.')。 – Luaan
23位,我可以表示最大值:'2^23 - 1' - 它沒關係我放在哪裏。這是指數工作。無論如何 - 你可以去聊天嗎? HTTP://chat.stackoverflow。COM /間/ 51161 /餘地royi-納米爾和-luaan –