我认为直接在没有类型转换的情况下执行 afloat
和 a之间的比较的代码会被破坏;double
即使语言规范说float
将被隐式转换,也有两种不同的方式可以明智地执行比较,并且两种方式都不足以真正证明“静默”默认行为是合理的(即编译时不产生警告的方式) . 如果想通过将两个操作数都评估为 来执行转换double
,我建议添加显式类型转换以明确意图。但是,在大多数情况下,除了测试特定double
->float
转换是否可逆而不损失精度之外,我怀疑float
值之间的比较可能更合适。
从根本上说,在比较浮点值X
和Y
任何类型时,应该将比较视为表明X
或Y
更大,或者数字是“无法区分的”。X
应进行显示较大的比较,以表明应表示的数字Y
可能小于X
或接近X
。一个说数字无法区分的比较就是这个意思。如果以这种方式看待事物,则通过强制转换执行的比较float
可能不像使用 进行的比较那样“信息丰富” double
,但不太可能产生完全错误的结果。相比之下,考虑:
double x, y;
float f = x;
如果比较f
and y
,可能感兴趣的是如何y
与x
rounded to a float的值进行比较,但更可能的是,人们真正想知道的是,如果知道 的舍入值x
,是否可以说什么关于x
和之间的关系y
。如果x
是 0.1 和y
0.2,f
就会有足够的信息来说明是否x
大于y
;如果y
是 0.100000001,则不会。在后一种情况下,如果两个操作数都强制转换为 double,则比较将错误地暗示x
更大;如果它们都被转换为浮动,则比较会将它们报告为无法区分。请注意,将两个操作数转换为时的比较结果double
可能是错误的,不仅当值在百万分之一以内时;它们可能相差数百个数量级,例如 x=1e40 和 y=1e300。比较f
和y
as float
,它们会比较难以区分;比较它们,double
较小的值会错误地比较大。