Java 浮动到两倍会产生奇怪的结果
在类型铸造过程中,我遇到了这种浮动和双重的行为 为了更好地理解,我修改了我的实际陈述 1Java 浮动到两倍会产生奇怪的结果,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
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
值转换为字符串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