当前位置: 首页 > 知识库问答 >
问题:

安全地将“float”转换为“double”,而不损失精度

李景天
2023-03-14

我有下面的抓耳挠腮,演示在jshell11.0.1217.0.1这里

jshell> 13.9f
$1 ==> 13.9

jshell> 13.9
$2 ==> 13.9

jshell> (double) 13.9f
$3 ==> 13.899999618530273

两个版本中的简单编译类中都会发生相同的情况

strictfp public class Test {

    public strictfp static void main(String[] args) {
        System.out.format("%s%n", (double) 13.9f);
        System.out.format("%s%n", 13.9f);
    }

}
╰─➤  java Test      
13.899999618530273
13.9

尽管17警告不再需要strictfp

warning: [strictfp] as of release 17, all floating-point expressions are evaluated strictly and 'strictfp' is not required

JLS在第5.1节中说明了这一点。2.

A widening primitive conversion does not lose information about the overall
magnitude of a numeric value in the following cases, where the numeric value is
preserved exactly:
• from an integral type to another integral type
• from byte, short, or char to a floating-point type
• from int to double
• from float to double

14年,在项目清单之后,它包含以下内容

A widening primitive conversion from float to double that is not strictfp may
lose information about the overall magnitude of the converted value.

根据我的阅读,这是实现中的错误?我发现执行此转换的唯一可靠方法是Double.parseDouble(Float.toString(13.9f))

共有1个答案

岳安福
2023-03-14

根据我的理解,这是实现中的一个bug吗?

不,这是你期望中的错误。您看到的double值与float值完全相同。精确值为13.899996185302734375。

这与“最接近13.9的double值”不同,后者为13.900000000000003552713678800500929355621337890625。

您正在将值13.899996185302734375指定给双精度值,然后打印字符串表示形式-即13.89999618530273,因为这样的精度足以将其与其他双精度值完全区分开来。如果打印13.9,那将是一个错误,因为有一个接近13.9的值,即13.9000000000000035552713678800500929355621337890625。

 类似资料:
  • 问题内容: 我有一个原始浮点数,需要作为原始双数。简单地将浮标转换为两倍会给我带来额外的精度。例如: 但是,如果我不是强制类型转换,而是将浮点数输出为字符串,然后将字符串解析为双精度,那么我将得到所需的内容: 有没有比String返回更好的方法了? 问题答案: 这并不是说你实际上获得了更高的精度-而是浮标没有准确地代表你最初瞄准的数字。双被精确地表示原始浮子; 显示的是已经存在的“额外”数据。 例

  • 问题内容: 尝试如下 输出:12.0 但我想获得12.00的精度 请让我知道正确的方法,而不在字符串类中使用format()方法 问题答案: 使用而不是双重: 之所以有效,是因为保持了“精度”,构造函数将其设置为从右边的数字开始,并在中使用它。因此,如果仅将其丢弃,它就会打印出来。

  • 问题内容: 我正在尝试将字符串转换为,但是得到了。 我的字串是,现在我将其转换为我所拥有的任何一个。 我如何将其转换为它们中的任何一个。 请帮助我摆脱这个问题。 问题答案: 您必须为数字使用适当的语言环境,例如 版画

  • 问题内容: 我面临与转换为相关的问题。实际上,我将浮点类型存储在数据库中,但是当我们通过下面的代码从数据库中获取数据时,它是类型。我们获得的价值以表格的形式出现。 那么我们如何获得像这样的格式数据呢? 问题答案: 只需将您的双曲投向花车即可。 还要注意,基本类型不能存储无限的数字集:

  • 问题内容: 甲 字符串 一个的表示 双 写入和从由文件读 C# 应用。 C#应用程序使用以下片段将双精度型转换为字符串: C#应用程序使用以下片段将字符串转换为双精度型 如果要在 Java 应用程序中写入和读取同一文件,您将如何转换类型而不丢失数据? 问题答案: 我相信,只要使用就可以并且不会丢失数据。特别是从docs中获取: m或a的小数部分必须打印多少个数字?必须至少有一位数字来表示小数部分,

  • 问题内容: 如果我正在使用,并将其转换为,则该如何正确工作?值会被截断以适合浮点数吗?还是舍入值不同?抱歉,这听起来有点补救,但是我正在尝试掌握和转换的概念。 问题答案: 根据 Java语言规范的 第5.1.3节 : 从double到float的原始转换变窄由IEEE 754舍入规则(第4.2.4节)控制。这种转换可能会失去精度,但也会失去范围,导致非零双精度浮点为零,而有限双精度浮点为无穷大。双