Groovy - 混乱双重与浮动

时间:2016-09-10 09:45:39

标签: groovy double precision primitive-types

我正在使用以下两个陈述: -

double foo = 20.00
float bar = 20.00
println foo == bar

double foo = 20.01
float bar = 20.01
println foo == bar

它将输出显示为: -

true 
false

有谁能知道这两个陈述之间的区别是什么?

3 个答案:

答案 0 :(得分:4)

doublefloat值不具有每个值的精确内部表示。可以表示为两个小数点的IEEE-754二进制浮点的唯一十进制值是0,0.25,0.5,0.75和1.其余的表示将始终稍微关闭,双精度和浮点数之间的差异很小这种不平等行为。

这不仅对Groovy有效,对Java也有效。

例如:

double foo = 20.25
float bar = 20.25
println foo == bar

输出:

  

答案 1 :(得分:1)

Groovy Float没有准确地保存在内存中。这是造成差异的主要原因。

在Groovy中,通过以下方法签名可以通过点右侧后面的位数来定义精度:

  

public float trunc(int precision)
  precision - 要保留的小数位数。

有关详情,请点击Class Float documentation

使用Groovy语言时,更倾向于使用 BigDecimal 类作为浮点数。 从Number到String的转换更容易,并且可以选择在构造函数中定义浮点数**的精度。

  

BigDecimal(BigInteger unscaledVal,int scale)   将BigInteger非标度值和int标度转换为BigDecimal。

有关详细信息,请按照Java BigDecimal documentation进行操作。由于Groovy语言基于Java语言。 BigDecimal的更多内容将代表数字的确切值。

答案 2 :(得分:1)

20.01的0.1部分是二进制无限重复; 20.01 =

... 10100.00000010100011110101110000101000111101011100001010001111010111

浮点数舍入(最接近)24位有效位;双打四舍五入为53.这使浮动

10100.0000001010001111011

和双

10100.000000101000111101011100001010001111010111000011

在十进制中,那些是

20.0100002288818359375和

分别为20.010000000000001563194018672220408916473388671875。

(您可以直接使用我的decimal to floating-point converter查看此内容。)