添加浮动产生双倍

时间:2015-06-08 11:54:22

标签: groovy

这种常规:

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,因为它似乎不想使用它们?

2 个答案:

答案 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)数字的情况,例如用于图形处理。