当前位置: 首页 > 面试题库 >

Java浮点数的显示精度

薛华容
2023-03-14
问题内容

如果我们运行以下代码:

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)。为什么?


问题答案:

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

Java的浮点数默认格式使用最少的有效十进制数字来将数字与附近的可表示数字区分开。1个

在您的示例中,1.2345678990922222f源文本中的float值转换为值1.23456788063049316406406,因为在该float类型可表示的所有值中,最接近的值是1.2345678990922222。下一个较低和下一个较高的值是1.23456776142120361328125和1.23456799983978271484375。

在打印此值时,Java只需要打印“
1.2345679”,因为这足以使我们可以float从其邻居1.23456776142120361328125和1.23456799983978978271484375中选择值1.2345678806304931640625。

对于您的double示例,1.22222222222222222222d将转换为1.22222222222222232090871330001391470432281494140625。可代表的下一个较低和下一个较高的值double是1.2222222222222220988641083749826066195964813232421875和1.2222222222222225429533182250452227890491485595703125。如您所见,为了将1.22222222222222232090871330001391470432281494140625与它的邻居区分开来,Java需要打印“
1.2222222222222223”。

脚注

1 Java SE
10
的规则可以在该toString(float d)部分的java.lang.float文档中找到。该double文档是相似的。段落中最相关的部分为粗体:

返回的字符串表示形式float argument。下面提到的所有字符都是ASCII字符。

  • 如果参数为NaN,则结果为字符串“ NaN”。

  • 否则,结果是一个字符串,代表参数的符号和大小(绝对值)。如果符号为负,则结果的第一个字符为’ -‘('\u002D');
    如果符号为正,则结果中不显示符号字符。至于大小 m

    • 如果 m 为无穷大,则用字符“ Infinity”表示;因此,正无穷大产生结果“无穷大”,而负无穷大产生结果“-无穷大”。

    • 如果 m 为零,则用字符“ 0.0”表示;因此,负零产生结果“ -0.0”,而正零产生结果“ 0.0”。

    • 如果 m 大于或等于10 -3但小于10 7,则将其表示为 m 的整数部分,十进制形式,不带前导零,后跟’
      .‘('\u002E'),后跟一个或多个十进制数字表示 m 的分数部分。

    • 如果 m 小于10 -3或大于或等于10 7,则以所谓的“计算机科学计数法”表示。让 Ñ 是唯一的整数,使得10 Ñ
      <10 Ñ 1 ; 然后让 一个 是的数学上精确的商数 和10 Ñ 使得1≤ 一个 然后<10的大小被表示为的整数部分 一个
      ,作为一个单一的十进制数字,后跟“ .”( '\u002E'),其次是十进制数字表示的小数部分 一个
      ,后面跟有字母“E‘('\u0045'),后跟 n 表示为十进制整数,由方法产生Integer.toString(int)

ma 的小数部分必须打印多少个数字?
必须有至少一位数字来表示小数部分,并且除此以外,还需要与唯一数量不同的数字,以便将参数值与type的相邻值唯一区分开float也就是说,假设
x 是此方法针对有限的非零参数 f 生成的十进制表示形式所表示的精确数学值。那么 f 必须是float最接近 x
的值;或者,如果两个float值相等地接近 x ,则 f 必须是其中之一,且 f 的最低有效位必须为0。



 类似资料:
  • 问题内容: 如果我有以下小数点数字: 然后我得到以下输出: 我想要的是: 问题答案: 可能令人困惑的部分是 的表示整个数(包括小数)的长度,而不仅仅是小数之前的部分。该代表的小数位数。 因此,要使格式正确无误,最多可以有小数点前4个数字和小数点后3个位,实际上是所需的格式。

  • 问题内容: $a = ‘35’; $b = ‘-34.99’; echo ($a + $b); 结果为0.009999999999998 这是怎么回事?我想知道为什么我的程序不断报告奇怪的结果。 为什么PHP不返回预期的0.01? 问题答案: 因为浮点运算!=实数运算。对于一些浮子和,由不精确性引起的差异的说明是。这适用于使用浮点数的任何语言。 由于浮点数是具有有限精度的二进制数,因此存在有限数量

  • 本文向大家介绍Fortran 浮点数精度,包括了Fortran 浮点数精度的使用技巧和注意事项,需要的朋友参考一下 示例 类型的浮点数real不能有任何实数值。它们可以表示实数,最多可以包含一定数量的十进制数字。 FORTRAN 77保证了两种浮点类型,而最新的标准则至少保证了两种实数类型。实变量可以声明为 x这是默认类型的实数,并且y是比更大的十进制精度的实数x。在Fortran 2008中,十

  • 问题内容: 是否在任何地方都有Java库可以对IEEE 754半精度 数字执行计算或将其与双精度数字进行转换? 这些方法中的任何一种都是合适的: 将数字保持为半精度格式,并使用整数算术和位扭曲(如MicroFloat的单精度和双精度)进行计算 以单精度或双精度执行所有计算,转换成半精度以进行传输(在这种情况下,我需要经过良好测试的转换函数。) 编辑 :转换需要100%准确- 输入文件中 有 很多N

  • 程序是这样的。它的意思是根据工作时数、时薪、扣缴税款等来计算员工的净工资。它计算正确,但双点精度格式将最后一个小数四舍五入,失去了计算的准确性。 示例输入: } 请怜悯;我是一年级学生。

  • 在我的计算机科学课程中,我们正在研究浮点数以及它们在内存中是如何表示的。我已经理解了它们在内存中是如何表示的(尾数/有效数、指数及其偏差、符号位),我也理解了浮点是如何相互添加和减去的(反规格化和所有那些有趣的东西)。然而,在翻阅一些学习问题时,我注意到一些我无法解释的东西。 当一个不能精确表示的浮点数加到自己身上几次时,答案比我们在数学上预期的要低,但当同一个浮点数乘以一个整数时,答案就精确地得