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。
添加回答
举报