【发布时间】:2016-02-23 06:55:35
【问题描述】:
众所周知,浮点数,即使是十进制格式中小数点后固定位数的浮点数,也不能精确表示。所以我有以下程序要测试:
public class Main {
public static void main(String[] args) {
System.out.printf("0.1 in single precision is %.50f\n", 0.1f);
System.out.printf("0.2 in single precision is %.50f\n", 0.2f);
System.out.printf("0.3 in single precision is %.50f\n", 0.3f);
System.out.printf("0.1 + 0.2 in single precision is %.50f\n", 0.1f + 0.2f);
System.out.printf("0.1 + 0.2 == 0.3 is %b in single precision\n", 0.1123f * 0.4f + 0.2f * 0.5f == 0.2f * 0.7f + 0.0123f * 0.4f);
System.out.println();
System.out.printf("0.1 in double precision is %.50f\n", 0.1);
System.out.printf("0.2 in double precision is %.50f\n", 0.2);
System.out.printf("0.3 in double precision is %.50f\n", 0.3);
System.out.printf("0.1 + 0.2 in double precision is %.50f\n", 0.1 + 0.2);
System.out.printf("0.1 + 0.2 == 0.3 is %b in double precision\n", 0.1 + 0.2 == 0.3);
}
}
输出如下:
0.1 in single precision is 0.10000000149011612000000000000000000000000000000000
0.2 in single precision is 0.20000000298023224000000000000000000000000000000000
0.3 in single precision is 0.30000001192092896000000000000000000000000000000000
0.1 + 0.2 in single precision is 0.30000001192092896000000000000000000000000000000000
0.1 + 0.2 == 0.3 is true in single precision
0.1 in double precision is 0.10000000000000000000000000000000000000000000000000
0.2 in double precision is 0.20000000000000000000000000000000000000000000000000
0.3 in double precision is 0.30000000000000000000000000000000000000000000000000
0.1 + 0.2 in double precision is 0.30000000000000004000000000000000000000000000000000
0.1 + 0.2 == 0.3 is false in double precision
我无法从上述结果中回答两个问题,我正在寻求帮助:
- 为什么
0.1、0.2和0.3的双重表示看起来准确,而0.1 + 0.2不准确。 - 为什么
0.1f + 0.2f == 0.3f返回true?
【问题讨论】:
-
比较浮点数(任何语言)通常不是一个好主意。您可以减去它们,看看结果是否小于或等于某个非常小的数字。请参阅stackoverflow.com/questions/322749/… 和floating-point-gui.de/languages/java
-
@JFPicard 这似乎不是重复的; OP 似乎意识到了这个问题,并试图更深入地理解它。
标签: java floating-point