为了账号安全,请及时绑定邮箱和手机立即绑定

Java 浮点的显示精度

Java 浮点的显示精度

慕无忌1623718 2022-07-06 18:55:39
如果我们运行以下代码:float f = 1.2345678990922222f;double d = 1.22222222222222222222d;System.out.println("f = " + f + "\t" + "d = " + d);它打印:f = 1.2345679   d = 1.2222222222222223文字 1.2345678990922222 中的长尾被忽略,但 1.22222222222222222222 中的长尾未被忽略(变量 d 中的最后一个十进制数字变为 3 而不是 2)。为什么?
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

float您在打印 a或 a时看到的位数是 Java 将和转换为十进制double的默认规则的结果。floatdouble

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”。

脚注

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;然后让am和 10 n的数学精确商,使得 1 ≤ a < 10。然后将大小表示为 a 的整数部分作为一个十进制数字,后跟 ' .' ( '\u002E'),然后是十进制数字表示a的小数部分,后跟字母 'E' ( '\u0045'),后跟n表示为十进制整数,由方法 生成Integer.toString(int)

ma的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,除此之外,必须有尽可能多的数字,但仅能将参数值与 type 的相邻值区分开来float也就是说,假设x是由该方法为有限非零参数f生成的十进制表示所表示的精确数学值。那么f必须是float最接近x的值;或者,如果两个float值同样接近x,则f必须是其中之一,并且f的有效位的最低有效位必须为 0。


查看完整回答
反对 回复 2022-07-06
  • 1 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号