双人或float数据类型不循环正常addup?(double or float datatype d

2019-06-24 05:29发布

在一个循环我加入0.10直到我达到所需的#,并获得该指数。 这是我的代码:

    private static int getIndexOfUnits(float units) {
    int index = -1;
    float addup = 0.10f;
    for(float i = 1.00f; i < units; i=(float)i+addup) {
        index++;
        System.out.println("I = " + i + " Index = " + index);
    }

    return index;
}

如果传递的单位是5.7,我看可能输出是:

I = 1.0 Index = 0
I = 1.1 Index = 1
I = 1.2 Index = 2
I = 1.3000001 Index = 3
I = 1.4000001 Index = 4
I = 1.5000001 Index = 5
I = 1.6000001 Index = 6
I = 1.7000002 Index = 7
I = 1.8000002 Index = 8
I = 1.9000002 Index = 9
I = 2.0000002 Index = 10
I = 2.1000001 Index = 11
I = 2.2 Index = 12
I = 2.3 Index = 13
I = 2.3999999 Index = 14
I = 2.4999998 Index = 15
I = 2.5999997 Index = 16
I = 2.6999996 Index = 17
I = 2.7999995 Index = 18
I = 2.8999994 Index = 19
I = 2.9999993 Index = 20
I = 3.0999992 Index = 21
I = 3.199999 Index = 22
I = 3.299999 Index = 23
I = 3.399999 Index = 24
I = 3.4999988 Index = 25
I = 3.5999987 Index = 26
I = 3.6999986 Index = 27
I = 3.7999985 Index = 28
I = 3.8999984 Index = 29
I = 3.9999983 Index = 30
I = 4.0999985 Index = 31
I = 4.1999984 Index = 32
I = 4.2999983 Index = 33
I = 4.399998 Index = 34
I = 4.499998 Index = 35
I = 4.599998 Index = 36
I = 4.699998 Index = 37
I = 4.799998 Index = 38
I = 4.8999977 Index = 39
I = 4.9999976 Index = 40
I = 5.0999975 Index = 41
I = 5.1999974 Index = 42
I = 5.2999973 Index = 43
I = 5.399997 Index = 44
I = 5.499997 Index = 45
I = 5.599997 Index = 46
I = 5.699997 Index = 47

如果单位是像18.90或29.90大数目,它给出错误的指标。 指数通常是1小于它应该是。 最初只有0.10加入,但2.3之后,它得到2.39999 ....关于添加0.10〜它。 我相信这是精度问题。 如何处理它,并确保我得到很大#的右手食指也无论使用float或double。

有任何想法吗 !!!!

Answer 1:

从浮点指南 :

为什么我的数字,像0.1 + 0.2加起来一个漂亮的圆0.3,我反而得到怪异的结果像0.30000000000000004?

因为在内部,计算机使用的格式(二进制浮点),其不能准确地表示相同的0.1,0.2或0.3,在所有的数。

当代码被编译或解释,你的“0.1”已经四舍五入到该格式的最接近的数字,这会导致计算发生之前,即使一个小的舍入误差。

您cnnot使用floatdouble ,如果你需要的数字加起来exaclty。 使用BigDecimal代替。



Answer 2:

问题是,漂浮使用的格式并不能代表所有的十进制数,所以精度有时会丢失。

使用的BigDecimal代替。



Answer 3:

确切表示不可用float数据类型。

BigDecimal的帮助you.Below例子可能是对你有帮助

BigDecimal decimal=new BigDecimal(10.0);
    for (int i = 0; i < 10; i++) {
        decimal=decimal.add(new BigDecimal(.1));
        System.out.println(decimal.floatValue());

    }


Answer 4:

你不应该使用float对这种事情(索引/迭代)。

试试每一次计算I:

I = 1.0f + (i*addup);

你会不会积累浮点错误。



Answer 5:

我想这可能是你在找什么:

Java提供了从导入包中的类:所谓的DecimalFormat 进口java.text.DecimalFormat中 。 它的签名是:

DecimalFormat myFormat = new DecimalFormat("0.0");

这需要,您可以指定要如何显示的格式字符串参数。

这里是你如何把它应用到你的代码:

DecimalFormat myFormat;
private static int getIndexOfUnits(float units) {
myFormat = new DecimalFormat("0.0");
int index = -1;
float addup = 0.10f;
for(float i = 1.00f; i < units; i=(float)i+addup) {
    index++;
    System.out.println("I = " + myFormat.format(i) + " Index = " + index);
}

return index;

}

在你的println,你可以看到的DecimalFormat的类format()方法被调用float i使用myFormat对象引用的DecimalFormat -这是格式化发生。



文章来源: double or float datatype doesn't addup properly in a loop?