1 回答

TA貢獻1873條經驗 獲得超9個贊
float
您在打印 a或 a時看到的位數是 Java 將和轉換為十進制double
的默認規則的結果。float
double
Java 對浮點數的默認格式使用最少的有效十進制數字來區分數字和附近的可表示數字。1
在您的示例中,1.2345678990922222f
源文本轉換為float
值 1.2345678806304931640625,因為在該float
類型中可表示的所有值中,該值最接近 1.2345678990922222。下一個較低值和下一個較高值是 1.23456776142120361328125 和 1.23456799983978271484375。
在打印這個值時,Java 只需要打印“1.2345679”,因為這足以讓我們float
從它的鄰居 1.23456776142120361328125 和 1.23456799983978271484375 中挑選出 1.2345678806304931640625 的值。
對于您的double
示例,1.22222222222222222222d
轉換為 1.22222222222222232090871330001391470432281494140625??杀硎镜南乱粋€較低值和下一個較高值double
是 1.2222222222222220988641083749826066195964813232421875 和 1.2222222222222225429533182250452227890491485595703125。如您所見,為了將 1.22222222222222232090871330001391470432281494140625 與其鄰居區分開來,Java 需要打印“1.2222222222222223”。
腳注
1 Java SE 10的規則可以在 java.lang.float 的文檔中找到toString(float d)
。double
文檔類似。這段話,最相關的部分用粗體表示,是:
返回 的字符串表示形式
float argument
。下面提到的所有字符都是 ASCII 字符。
如果參數為 NaN,則結果為字符串“NaN”。
否則,結果是一個字符串,表示參數的符號和大小(絕對值)。如果符號為負,則結果的第一個字符為 '
-
' ('\u002D'
);如果符號為正,則結果中不會出現符號字符。至于幅度m:
如果m為無窮大,則用字符“Infinity”表示;因此,正無窮產生結果“Infinity”,負無窮產生結果“-Infinity”。
如果m為零,則用字符“0.0”表示;因此,負零產生結果“-0.0”,正零產生結果“0.0”。
如果m大于等于 10 -3但小于 10 7,則表示為m的整數部分,以十進制形式表示,不帶前導零,后跟 '
.
' ('\u002E'
),后跟一個或多個小數位表示m的小數部分。如果m小于 10 -3或大于或等于 10 7,則它以所謂的“計算機科學計數法”表示。令n為唯一整數,使得 10 n ≤ m < 10 n +1;然后讓a是m和 10 n的數學精確商,使得 1 ≤ a < 10。然后將大小表示為 a 的整數部分,作為一個十進制數字,后跟 '
.
' ('\u002E'
),然后是十進制數字表示a的小數部分,后跟字母 'E
' ('\u0045'
),后跟n表示為十進制整數,由方法 生成Integer.toString(int)
。m或a的小數部分必須打印多少位?必須至少有一個數字來表示小數部分,除此之外,必須有盡可能多的數字,但僅能將參數值與 type 的相鄰值區分開來
float
。也就是說,假設x是由該方法為有限非零參數f生成的十進制表示所表示的精確數學值。那么f必須是float
最接近x的值;或者,如果兩個float
值同樣接近x,則f必須是其中之一,并且f的有效位的最低有效位必須為 0。
添加回答
舉報