我建议浮点类型最有效地被视为表示值的范围。 0.1f显示为0.1而不是0.100000001490116119384765625的原因是它实际上代表从13421772.5 / 134217728到13421773.5 / 134217728(即从0.0999999977648258209228515625到0.1000000052154064178466796875)的数字范围;添加额外的数字表示数字大于0.100可能没什么意义是没有意义的,也不会使用一串表示当数字可能更大时小于0.100的数字。

将double转换为float将选择float,其值范围包括double表示的double的范围。请注意,虽然此操作是不可逆的,但操作的结果通常是算术正确的;唯一一次它不是100%算术正确的,如果一个人正在施放浮动一个双精度,其范围精确地以两个浮标之间的边界为中心。在那种情况下,系统会选择双方范围的一侧或另一侧的浮动;如果double实际上表示该范围的错误一侧的数字,则所得到的转换将略微不准确。

在实践中,上面提到的微小不精确几乎从不相关,因为浮点类型所代表的“值范围”实际上比上面指出的要大一些。对具有一定不确定性的两个数字执行计算(例如加法)将产生具有更多不确定性的结果,但系统将不会跟踪存在多少不确定性。尽管如此,除非一个人在浮动上执行数十次操作,或者对一次操作执行数千次操作,否则不确定性的数量通常会小到不用担心。

重要的是要注意,将float转换为double实际上比将double转换为float更危险,即使Java允许前者隐式没有警告而是对后者发出警告。将浮点数转换为double会导致系统选择其范围以浮点范围的中心为中心的double。这几乎总是会产生一个值,其实际不确定性远远大于双精度数的典型值。例如,如果将一个0.1f转换为double,则得到的double将表示0.10000000149011611到0.10000000149011613范围内的数字,即使它应该代表的数字(十分之一)相对来说也不在该范围附近。