当double值传递float值时,Double Precision

Hit*_*esh 3 java floating-point double

我有关于双精度的问题.当浮点值传递给double时,我会得到一些不同的结果.例如

float f= 54.23f;
double d1 = f;
System.out.println(d1);
Run Code Online (Sandbox Code Playgroud)

输出为54.22999954223633.有人可以解释这种行为背后的原因.它是否像两个十进制精度的默认值一样.

Eri*_*hil 6

相同的值被用于不同地印刷floatdouble因为Java规范要求印刷为根据需要来区分相邻表示的值中的值相同的类型(每我的答案许多数字这里,看链接文档用于更精确的定义).

由于float表示值的位数较少,因此值较少,因此它们间隔较大,并且您不需要那么多的数字来区分它们.将值放入double并打印时,Java规则要求打印更多数字,以便将值与附近double值区分开来.该println函数不知道该值最初来自a float并且不包含尽可能多的信息double.

54.23f正是54.229999542236328125(十六进制,0x1.b1d70ap + 5).的float正下方和正上方这个值是54.2299957275390625(0x1.b1d708p + 5)和54.23000335693359375(0x1.b1d70cp + 5).正如您所看到的,打印"54.229999"会将值与54.229995 ......和54.23 ......区分开来.但是,double刚好在下面和上面的值54.23f是54.22999954223632101957264239899814128875732421875和54.22999954223633523042735760100185871124267578125.要区分该值,您需要"54.22999954223633".