Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/authentication/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy-双重与浮动_Groovy_Double_Precision_Primitive Types - Fatal编程技术网

Groovy-双重与浮动

Groovy-双重与浮动,groovy,double,precision,primitive-types,Groovy,Double,Precision,Primitive Types,我使用以下两种说法:- double foo = 20.00 float bar = 20.00 println foo == bar 及 其输出为:- true false 有人知道这两个语句之间的区别吗?double和float值并不是每个值都有一个精确的内部表示形式。对于两个小数点,可以表示为IEEE-754二进制浮点的唯一十进制值是0、0.25、0.5、0.75和1。表示的其余部分将始终稍有偏离,double和float之间的微小差异会造成这种不平等行为 这不仅适用于Groovy,

我使用以下两种说法:-

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

其输出为:-

true 
false

有人知道这两个语句之间的区别吗?

double
float
值并不是每个值都有一个精确的内部表示形式。对于两个小数点,可以表示为IEEE-754二进制浮点的唯一十进制值是0、0.25、0.5、0.75和1。表示的其余部分将始终稍有偏离,double和float之间的微小差异会造成这种不平等行为

这不仅适用于Groovy,也适用于Java

例如:

double foo = 20.25
float bar = 20.25
println foo == bar
输出:

真的


Groovy Float并没有精确地保存在内存中。这是造成你们之间差异的主要原因

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

公共浮点trunc(整数精度)
精度-保留的小数位数

有关更多详细信息,请参阅

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

BigDecimal(biginger unscaledVal,int scale) 将BigInteger无标度值和整数标度转换为BigDecimal


有关更多详细信息,请参阅。因为Groovy语言是基于Java语言的。大于BigDecimal的部分将表示数字的精确值。

20.01的0.1部分在二进制中无限重复

10100.000000101000111010111000010101000111111010111000010101000111111011000010101000111111010111

浮点数四舍五入(最接近)为24个有效位;双打四舍五入为53分。这使得浮子

10100.000000101000111011

还有替身

10100.000000101000111010111000011000101000111101010111100000111

用十进制表示,它们是

20.0100002288818359375和

分别为20.010000000000001563194018672220408916473388671875


(您可以使用my直接看到这一点。)

我的回答是否解决了您的疑问?或者还有什么不清楚的吗?:)@不,你的回答很好,而且非常有用,我只是在等待其他信息。感谢此答案添加了有关20.01(用
float
表示)和
double
之间低级别差异的额外信息,但没有直接回答为什么20.00给出
true
输出,而20.01给出
false
输出的问题。@JoseignacioApozo 20是一个整数,因此在任何格式。20.01是一个浮点值,根据它是浮点值还是双精度值而有所不同。(你在回答中也没有明确提到这一点。)没有什么不愉快的感觉!我只是指出了真正的问题目的,你可以随时编辑你的答案。我的回答是:“其余的表示形式总是略微偏离,双精度表示和浮点表示之间的差异很小”。我认为这句话足够明确地说明了浮点数和双精度数之间的值有差异。特别是考虑到一个用32位表示,另一个用64位表示。
double foo = 20.25
float bar = 20.25
println foo == bar