Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 浮动到两倍会产生奇怪的结果_Java_Double - Fatal编程技术网

Java 浮动到两倍会产生奇怪的结果

Java 浮动到两倍会产生奇怪的结果,java,double,Java,Double,在类型铸造过程中,我遇到了这种浮动和双重的行为 为了更好地理解,我修改了我的实际陈述 1 System.out.println((double)((float)(128.12301)));//Output:128.12301635712188 始终保持相同的输出 2 System.out.println((double)((float)(128888.12301)));//Output:128888.125 这两种输出对我来说都很奇怪,我不明白它是如何工作的 有人能帮我吗?浮点是32位IEE

在类型铸造过程中,我遇到了这种浮动和双重的行为

为了更好地理解,我修改了我的实际陈述

1

System.out.println((double)((float)(128.12301)));//Output:128.12301635712188
始终保持相同的输出

2

System.out.println((double)((float)(128888.12301)));//Output:128888.125
这两种输出对我来说都很奇怪,我不明白它是如何工作的


有人能帮我吗?

浮点是32位IEEE 754浮点

double是64位IEEE 754浮点

float和double也是一样的,都是二进制浮点类型,但是double比float精度更高


检查更多详细信息

浮点是32位IEEE 754浮点

double是64位IEEE 754浮点

float和double也是一样的,都是二进制浮点类型,但是double比float精度更高

查看更多详细信息

此处涉及多个步骤,每个步骤都有不同的编号。让我们将每个语句的代码拆分为:

double original = 128.12301; // Or 128888.12301
float floatValue = (float) original;
double backToDouble = (double) floatValue;
System.out.println(backToDouble);
因此,对于每个数字,步骤如下:

  • 编译时:将源代码中的十进制值转换为最精确的
    double
  • 执行时间:将
    double
    值转换为最接近的精确
    float
  • 执行时间:将
    float
    值转换为
    double
    值(这不会丢失任何信息)
  • 执行时间:将最终的
    double
    值转换为字符串
  • 步骤1和2可能会丢失信息;第4步并不总是打印出准确的值——它只是按照实际情况打印

    我们以128.12301为例。在编译时转换为128.123009999999993624442140571773052215576171875。然后,转换为
    float
    的结果正好是128.123016357421875。因此,在转换回双精度后(保留该值),我们打印出128.123016357421875。这将打印128.12301635712188,因为这是可以打印出的最少数字,并且该值与最接近的大于或小于它的
    double
    值之间不存在歧义

    现在,对于128888.12301,精确的
    双精度
    值是128888.12300999995701946318149566650390625-最接近的
    浮点值是
    128888.125. 将其转换回
    double
    后,会打印出该
    double
    的确切值,因为它附近还有其他确切的
    double

    基本上,结果将取决于开始时包含的有效数字的数量,以及当它四舍五入到最近的
    double
    ,然后四舍五入到最近的
    float
    时会丢失多少信息。这里涉及到几个步骤,每个步骤都有不同的数字。让我们将每个语句的代码拆分为:

    double original = 128.12301; // Or 128888.12301
    float floatValue = (float) original;
    double backToDouble = (double) floatValue;
    System.out.println(backToDouble);
    
    因此,对于每个数字,步骤如下:

  • 编译时:将源代码中的十进制值转换为最精确的
    double
  • 执行时间:将
    double
    值转换为最接近的精确
    float
  • 执行时间:将
    float
    值转换为
    double
    值(这不会丢失任何信息)
  • 执行时间:将最终的
    double
    值转换为字符串
  • 步骤1和2可能会丢失信息;第4步并不总是打印出准确的值——它只是按照实际情况打印

    我们以128.12301为例。在编译时转换为128.123009999999993624442140571773052215576171875。然后,转换为
    float
    的结果正好是128.123016357421875。因此,在转换回双精度后(保留该值),我们打印出128.123016357421875。这将打印128.12301635712188,因为这是可以打印出的最少数字,并且该值与最接近的大于或小于它的
    double
    值之间不存在歧义

    现在,对于128888.12301,精确的
    双精度
    值是128888.12300999995701946318149566650390625-最接近的
    浮点值是
    128888.125. 将其转换回
    double
    后,会打印出该
    double
    的确切值,因为它附近还有其他确切的
    double

    基本上,结果将取决于开始时包含的有效数字的数量,以及当它四舍五入到最近的
    double
    ,然后四舍五入到最近的
    float
    System.out.println(number)
    时会丢失多少信息,这是一个相当复杂的方法(从其文档中可以看出)an的行为并不总是如您所期望的那样。它基本上给出了最短的字符串,该字符串唯一地确定了
    数字

    m或a的小数部分必须打印多少位数字?必须至少有一位数字来表示小数部分,除此之外,还必须有足够多的数字来唯一区分参数值与double类型的相邻值。也就是说,假设x是表示的精确数学值由该方法为有限非零变元d生成的十进制表示形式表示。则d必须是最接近x的双精度值;或者,如果两个双精度值相等接近x,则d必须是其中之一,且d的有效位的最低有效位必须为0

    System.out.println(number)
    将经历一个相当复杂的方法(如其文档中所示),它的行为并不总是如您所期望的那样。它基本上给出了最短的字符串,该字符串唯一地确定了
    number

    必须为m或a的小数部分打印多少位数字?必须至少有一位数字来表示小数部分,除此之外,还必须有足够多的数字,但只需要足够多的数字来唯一地将参数值与double类型的相邻值区分开来。Tha