double或float数据类型不能在循环中正确累加吗?

在循环中,我添加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之后,在添加0.10时得到2.39999....。我相信这是一个精确的问题。如何处理它,并确保无论使用float还是double,我都在大号上获得正确的索引。

有任何想法吗 !!!!

回答:

从浮点指南:

因为在内部,计算机使用的格式(二进制浮点数)根本无法准确表示一个数字,例如0.1、0.2或0.3。

编译或解释代码时,“ 0.1”已经舍入为该格式的最接近的数字,即使在计算之前,也会产生小的舍入误差。

您不使用,float或者double如果您需要数字来加总。使用BigDecimal代替。

以上是 double或float数据类型不能在循环中正确累加吗? 的全部内容, 来源链接: utcz.com/qa/429399.html

回到顶部