这种常规:
float a = 1;
float b = 2;
def r = a + b;
使用IntelliJ:
从.class反转时创建此Java代码float a = (float)1;
float b = (float)2;
Object r = null;
double var7 = (double)a + (double)b;
r = Double.valueOf(var7);
因此r
包含Double
。
如果我这样做:
float a = 1;
float b = 2;
float r = a + b;
它生成的代码用双精度执行加法并转换回浮点数:
float a = (float)1;
float b = (float)2;
float r = 0.0F;
double var7 = (double)a + (double)b;
r = (float)var7;
所以应该放弃float
s groovy,因为它似乎不想使用它们?
答案 0 :(得分:1)
Groovy决定采用5种标准结果类型的数值运算。回退到某些标准数字类型的操作。那些是int,long,BigInteger,double和BigDecimal。因此,添加/乘以两个浮点数会返回一个双精度值。分部和战队很特别。
来自http://www.groovy-lang.org/syntax.html
除了分区和电源二进制操作,
byte,char,short和int之间的二进制操作导致int
涉及long with byte,char,short和int result的二进制操作 长期
涉及BigInteger和任何其他整数类型的二进制运算 导致BigInteger
float,double和BigDecimal之间的二进制运算导致 双
BigDecimal中两个BigDecimal结果之间的二进制运算
至于你是否应该放弃float
...通常将double转换为float是合适的,特别是因为groovy会自动为你做这件事。
答案 1 :(得分:0)
.net(C#)与16位整数类似:添加字节或Int16会产生Int32。 可能是为了防止溢出。
使用"较小的"数据类型可能导致“更大”的数据类型数据类型。而且越大,我的意思就越多。
如本例所示(更多数字也意味着更多位)
15(2位)x 15(2位)= 225(3位)
1.5(2位)x 1.5(2位)= 2.25(3位)
但是,添加两个32位整数会返回一个32位整数。添加两个双打只会返回一个双精度数。这是因为(虚拟)机器针对这些尺寸进行了优化,这是因为物理处理器过去经过优化以适应这些尺寸。其中一些仍然是。即使在64位处理器上,32位操作通常仍然比64位操作更快。但是,16位操作不是或几乎没有。
您的编译器会尝试保护您免受溢出,并允许您显式检查它们。因此,除非你有充分的理由不这样做,否则我默认使用这些类型,并且在存储数据时可选择截断为compacter类型。
很好的理由不包括您处理大量(1000)数字的情况,例如用于图形处理。