問題描述
可能重復:
在java中使用雙精度保持精度
Java 程序中奇怪的浮點行為
我正在制作一個直方圖類,但遇到了一個奇怪的問題.
I'm making a histogram class, and I'm encountering a weird issue.
這是該類的基礎知識,還有更多方法,但與問題無關.
Here are the basics of the class, there are more methods but they aren't relevant to the issue.
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 + " ");
}
當我繪制頻率時會出現問題.我創建了 2 個實例.新直方圖(0, 1, 10);新直方圖(0, 10, 10);
the problem happens when I plot the frequencies. I've created 2 instances. new Histogram(0, 1, 10); new Histogram(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
所以我的問題是,為什么我在第一個示例中得到了非常長的小數限制,而在第二個示例中沒有?
So my question is, why am I getting the really long decimal limits in the first example, but not the second one?
推薦答案
有些小數不能用雙精度值精確表示.0.3 是這些值之一.
Some decimals cannot be exactly represented by double values. 0.3 is one of those values.
所有小于某個數字(我忘記了)的整數值恰好有一個雙精度值的精確表示,所以你看不到近似值.
All integer values less than a certain number (I forget which) happen to have an exact representation by a double value, so you don't see the approximation.
考慮我們如何看待數字:數字 123 表示為 (1 * 100) + (2 * 10) + (3 * 1).我們使用 10 作為我們的基礎.二進制數使用兩個.因此,當您查看數字的分數時,如何通過添加 2 的單個冪來表示 0.3?你不能.你能想到的最好的值大約是 0.30000000000000004(我必須查看確切的二進制數字才能知道它是如何達到的).
Consider how we think of numbers: the number 123 is represented as (1 * 100) + (2 * 10) + (3 * 1). We use 10 as our base. Binary numbers use two. So when you look at fractions of a number, how could you represent 0.3 by adding individual powers of 2? You can't. The best you can come up with is about 0.30000000000000004 (I'd have to see the exact binary digits to see how it reaches that).
這篇關于Java:使用雙精度不準確的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!