當然, System.out.println(0.1);
輸出0.1
。但是對於任意小數點總是這樣嗎? (排除的雙號本身。如,System.out.println(0.10000000000000000001);
輸出0.1
精度而導致的情況下)「System.out.println(DECIMAL)」是否始終在代碼中輸出相同的DECIMAL?
當我打System.out.println(DECIMAL);
我認爲,DECIMAL被轉換成二進制(雙)和二進制轉換成十進制(以輸出小數點作爲字符串)
想想下面的轉換。
小數[D1] - >(CONVERSION1) - >二進制[B] - >(CONVERSION2) - >十進制[D2]
CONVERSION1:
(的顯著位的範圍內雙倍)[D1]的最接近的二進制數被選擇爲[B]
例如[D1] 0.1 - > [B] 0x0.1999999999999a
CONVERSION2:
[D2]是十進制數可以唯一區分[B],並且具有最小的位數。
例如[B] 0x0.1999999999999a - > [D2] 0.1
QUOTE Java7 API Double.toString(double d)
多少位必須被打印的米或一個小數部分?必須至少有一位數字來表示小數部分,並且除此之外還需要多少位數,但只需要多少位數來唯一地區分參數值和類型爲double的相鄰值。也就是說,假設x是由該方法對有限非零參數d產生的十進制表示所表示的精確數學值。那麼d必須是最接近x的double值;如果兩個double值都同樣接近x,那麼d必須是其中之一,d的有效數字的最低顯著位必須爲0
我的問題:
「[D1] = [D2]」是否總是正確的?
爲什麼我問這個問題:
思考下面的情況,
節省用戶的十進制輸入作爲雙 - >顯示的是十進制
我想知道是否保證[用戶輸入=顯示]。
(如上所述,排除由雙數本身的精度導致的情況。因爲那很長的輸入是罕見的情況。)
我知道當我需要精確的算術時,我應該使用BigDecimal。但在這種情況下,我不需要精確的算術。只想顯示與用戶輸入相同的小數點。
聽起來像你一路都知道,但你想要你的方式! :)但它會很有趣,看到它的一些答案。 – sakura
我已經讀過兩遍你的問題,但我仍然不明白你的問題。 –