我正在使用以下两个陈述: -
double foo = 20.00
float bar = 20.00
println foo == bar
和
double foo = 20.01
float bar = 20.01
println foo == bar
它将输出显示为: -
true
false
有谁能知道这两个陈述之间的区别是什么?
答案 0 :(得分:4)
double
和float
值不具有每个值的精确内部表示。可以表示为两个小数点的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查看此内容。)