我发现在尝试弄清楚何时将值计算为double以及何时将其转换为Java中的整数时,我感到很困惑。例如:
System.out.println( 1 / 3 );
System.out.println( 1 / 3d );
System.out.println( 1d / 3 );
System.out.println( 1/ 1d / 3 );
产生
0
0.3333333333333333
0.3333333333333333
0.3333333333333333
我是否可以安全地假设如果表达式中有任何一个双精度则整个表达式将始终为double,并且只有当每个值都是整数时才将它视为整数除法?
答案 0 :(得分:2)
引用规范:
4.2.4. Floating-Point Operations
如果数值运算符的至少一个操作数是类型的 double,然后使用64位浮点执行操作 算术,并且数值运算符的结果是值 双打。如果另一个操作数不是double,则首先加宽 (§5.1.5)通过数字提升键入double(§5.6)。
15.17. Multiplicative Operators
运算符*,/和%称为乘法运算符。
...
乘法表达式的类型是其提升类型 操作数。
如果提升的类型是int或long,则整数算术是 进行。
如果提升的类型是float或double,那么浮点数 算术被执行。
所以是的,如果涉及至少一个double
,您可以安全地假设结果表达式始终为double
。
答案 1 :(得分:1)
你是对的。只要算术语句中有多个不同的数据类型,Java就会隐式地将所有值转换为一个统一类型,以便所有数字具有相同的数据类型。在第二个和第三个值的情况下,将整数除以double会导致整数转换为double,但在整数 - 整数除法内,Java不需要转换为统一类型,所以结果仍然是一个整数。
以下链接详细解释了这一点:mathbits.com/MathBits/Java/DataBasics/Mathoperators.htm
答案 2 :(得分:1)
是的,你是对的,如果其中一个操作数是double
,那么另一个操作数也将被提升为double
- 这包括除boolean
之外的所有原始类型。
可以在此处找到更详细/详细的解释:Java Language Specification
但是你应该注意表达式的评估顺序。 1 / 2d / 3
将提供与1 / 2 / 3d
不同的结果,因为这些实际上是2个表达式:(1 / 2d) / 3
。另外1d + 2 / 3
将提供与1 + 2 / 3d
不同的结果,因为在/
之前评估+
。因此,如果您希望代码正确,则必须确保第一个表达式已经评估为double
。