Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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
Java 浮点算术和双精度?_Java_Floating Point_Language Agnostic - Fatal编程技术网

Java 浮点算术和双精度?

Java 浮点算术和双精度?,java,floating-point,language-agnostic,Java,Floating Point,Language Agnostic,我被float和double之间的差异弄糊涂了。我读书。我想差别只是在精确度上。因此,我预计如果0.1+0.2==0.3返回false,那么0.1f+0.2f==0.3f 但是实际上0.1f+0.2f==0.3f返回true。为什么 这是纯Java问题还是什么?你不应该比较浮点或双精度是否相等,你不能真正保证分配给浮点或双精度的数字是精确的不,这只是十进制-二进制转换的产物 在引擎盖下,浮点数用二进制表示。数字0.1不能用二进制精确表示,因此需要四舍五入到最接近的可表示数字,其中浮点数为: 0.

我被
float
double
之间的差异弄糊涂了。我读书。我想差别只是在精确度上。因此,我预计如果
0.1+0.2==0.3
返回
false
,那么
0.1f+0.2f==0.3f

但是实际上
0.1f+0.2f==0.3f
返回
true
。为什么


这是纯Java问题还是什么?

你不应该比较浮点或双精度是否相等,你不能真正保证分配给浮点或双精度的数字是精确的

不,这只是十进制-二进制转换的产物

在引擎盖下,浮点数用二进制表示。数字0.1不能用二进制精确表示,因此需要四舍五入到最接近的可表示数字,其中
浮点数为:

0.100000001490119119384765625

double
是:

0.10000000000000055115123125782702118158340454015625

因此,如果将最接近0.1的
double
和最接近0.2的
double
相加,然后将结果四舍五入到最接近的
double
,实际上不会得到最接近0.3的
double
,而是得到它后面的一个(通常打印为
0.300000000000000004
,但实际上有更多的数字),因此缺乏平等性

另一方面,如果你加上最接近0.1的
float
和最接近0.2的
float
,然后将结果四舍五入到最接近的
float
,你会得到最接近0.3的
float
这句话太强了。在很多情况下,比较float是完全合理的s或双倍表示相等。