Java:使用双精度

Java:使用双精度,java,floating-point,double,Java,Floating Point,Double,可能重复: 我正在做一个直方图类,我遇到了一个奇怪的问题 下面是该类的基础知识,有更多的方法,但它们与问题无关 private int[] counters; private int numCounters; private double min, max, width; public Histogram(double botRange, double topRange, int numCounters) { counters = new int[numCounters];

可能重复:

我正在做一个直方图类,我遇到了一个奇怪的问题

下面是该类的基础知识,有更多的方法,但它们与问题无关

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");
}
private int[]计数器;
私人整数计数器;
私人双最小值、最大值、宽度;
公共直方图(双底距、双顶距、整数计数){
计数器=新整数[numCounters];
this.numCounters=numCounters;
最小值=范围;
最大值=最大范围;
宽度=(最大-最小)/(双)计数;
}
公共频率(){
对于(int i=0;i
这是因为有无限个可能的实数,只有有限的位数来表示这些数字


看看:

有些小数不能用双精度值精确表示。0.3就是其中之一

所有小于某个数字的整数值(我忘了是哪个)恰好有一个双精度的表示,所以你看不到近似值

考虑一下我们对数字的看法:数字123表示为(1*100)+(2*10)+(3*1)。我们使用10作为基数。二进制数使用2。因此,当你看一个数字的分数时,你怎么能通过加上2的单独幂来表示0.3呢?你不能。你能得出的最好结果大约是0.300000000000000004(我必须看到确切的二进制数字才能看到它是如何达到这个值的)。

来自:

因为在内部,计算机使用一种格式(二进制浮点) 这根本不能准确地表示0.1、0.2或0.3这样的数字

当编译或解释代码时,您的“0.1”已被删除 按该格式四舍五入到最接近的数字,这将导致较小的 甚至在计算之前就存在舍入误差


这就是第一个例子。第二个例子只涉及整数,而不是分数,整数可以用二进制浮点格式(最多52位)精确表示.

在第二种情况下,它们得到了取整。另请参见-这是相同的问题。

这与使用数字硬件进行浮点运算时固有的不精确性有关。这不仅限于Java,还包括所有编程语言,在这方面和其他方面已经被询问和回答了一千多次站点。参见示例和…仅供参考,这是IEEE(754)制定的标准的结果。在Java中,有一些方法可以解决这些精度问题。请参阅BigDecimal:一个罕见的事件:一个重复的问题,我不打算投票关闭。标题与重复的问题有很大的不同,这可能是帮助人们找到重复问题的一个好方法。因此,我是否应该将其在某个数字处截断,以获得一个更友好的值?
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