当前位置: 首页 > 面试题库 >

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

丰景同
2023-03-14
问题内容

循环中,我添加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.30000000000000004这样的怪异结果?

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

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

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



 类似资料:
  • 问题内容: float数据类型是单精度32位IEEE 754浮点,double数据类型是双精度64位IEEE 754浮点。 这是什么意思?我什么时候应该使用float而不是double? 问题答案: 总结一下: float用32位表示,带有1个符号位,8位指数和23位有效数(或从科学记号中得出的结果:2.33728 * 10 12; 33728为有效数)。 double 用64位表示,带有1个符号

  • float数据类型是单精度32位IEEE 754浮点,而double数据类型是双精度64位IEEE 754浮点。 这是什么意思?什么时候应该使用float而不是double或者相反呢?

  • 我有一个包含复杂条目的数组列表的结构,我想将它们转换为浮点数。虚部可以丢弃,这很好。 我想知道,为什么这不起作用,而另一方面,在创建列表“数组”之前将类型更改为float会起作用。 这是一个非常基本的问题,但如果有人能分享他或她的想法,我将非常高兴。 感谢提前:)

  • Imma java新手,所以我试着学东西。我创建了一个布尔方法,这是一个小的骰子游戏。我需要这个方法是从main方法调用,并继续玩,而返回值是真的(游戏是赢的),但停止执行,如果返回值是假的。我也需要多少次球员赢了。所以我创造了这样的东西: 初始化为私有静态int

  • 当我执行这段代码时,输出是“140”,也就是“28*5”,但它应该是“150”,也就是“28+31+30+31+30”,它应该计算两个月“2月”和“7月”之间的天数...所以这意味着for循环不能正常工作还是怎么的?为什么会这样!你能帮我一下吗??PS:我试图将循环中的j++更改为j+1,但Android Studio说“这不是一个声明”

  • 问题内容: 所以我在将文本文件读入程序时遇到了问题。这是代码: 我正在读取的文件是100行参数。如果我使用for循环,则效果很好。如果我使用while语句(在for循环上方被注释掉的那条语句)停止在50。用户有可能使用具有任意行数的文件运行该程序,因此我当前的for循环实现不会工作。 为什么行在50处停止?我检查了文本文件,没有什么可以挂断它的。 当我使用while循环时,我没有从try-catc