【发布时间】:2011-10-21 22:55:32
【问题描述】:
可能重复:
Retain precision with Doubles in java
Strange floating-point behaviour in a Java program
我正在制作一个直方图类,但遇到了一个奇怪的问题。
这是该类的基础知识,还有更多方法,但它们与问题无关。
private int[] counters;
private int numCounters;
private double min, max, width;
public Histogram(double botRange, double topRange, int numCounters) {
counters = new int[numCounters];
this.numCounters = numCounters;
min = botRange;
max = topRange;
width = (max - min) / (double) numCounters;
}
public void plotFrequency() {
for (int i = 0; i < counters.length; i++) {
writeLimit(i * width, (i + 1) * width);
System.out.println(counters[i]);
}
}
private void writeLimit(double start, double end) {
System.out.print(start + " <= x < " + end + "\t\t");
}
当我绘制频率时会出现问题。我创建了 2 个实例。 新直方图(0, 1, 10); 新直方图(0, 10, 10);
这是他们输出的内容。
Frequecy
0.0 <= x < 0.1 989
0.1 <= x < 0.2 1008
0.2 <= x < 0.30000000000000004 1007
0.30000000000000004 <= x < 0.4 1044
0.4 <= x < 0.5 981
0.5 <= x < 0.6000000000000001 997
0.6000000000000001 <= x < 0.7000000000000001 1005
0.7000000000000001 <= x < 0.8 988
0.8 <= x < 0.9 1003
0.9 <= x < 1.0 978
Frequecy
0.0 <= x < 1.0 990
1.0 <= x < 2.0 967
2.0 <= x < 3.0 1076
3.0 <= x < 4.0 1048
4.0 <= x < 5.0 971
5.0 <= x < 6.0 973
6.0 <= x < 7.0 1002
7.0 <= x < 8.0 988
8.0 <= x < 9.0 1003
9.0 <= x < 10.0 982
所以我的问题是,为什么我在第一个示例中得到了非常长的小数限制,而在第二个示例中没有?
【问题讨论】:
-
这与尝试使用数字硬件进行浮点运算时固有的不准确性有关。这不仅限于 Java,还适用于任何和所有编程语言,并且已经在此站点和其他站点上被询问和回答了上千次。参见例如The Perils of Floating Point
-
仅供参考,这是 IEEE (754) 制定的标准的结果。在 Java 中有解决这些精度问题的方法。请参阅 BigDecimal:download.oracle.com/javase/1,5.0/docs/api/index.html?java/math/…
-
一个罕见的事件:我不会投票关闭的副本。标题与重复的标题有足够的不同,这可能是帮助人们找到重复问题的好方法。
标签: java floating-point double