编程语言中浮点型精度损失问题(C#和Java)

看下面一段Java代码:

        double sum = 0;
        double d = 1064.8;
        sum += d;
        System.out.println(sum);
        sum += d;
        System.out.println(sum);
        sum += d;
        System.out.println(sum);
        sum += d;
        System.out.println(sum);
        sum += d;
        System.out.println(sum);
        sum += d;
        System.out.println(sum);

其输出结果为:

1064.8
2129.6
3194.3999999999996
4259.2
5324.0
6388.8

把sum和d改为float,则输出结果如下:

1064.8
2129.6
3194.4001
4259.2
5324.0
6388.8

在C#中,输出结果仍然如此,由于c#的toString方法会将3194.3999999999996输出为3194.4(原因我暂时未知),因此这里我用debug的方式显示结果:

编程语言中浮点型精度损失问题(C#和Java)_第1张图片

其他的语言这里不验证了,由java和c#得到的结果一致可以判断,这个误差不取决于语言。这里的原因其实也不复杂,无非就是因为浮点型数据在计算机中用二进制来表示,因此会产生这个误差。

针对这个问题,在java里面如果要进行连续的浮点型数据相加,请使用BigDecimal,在c#中也有decimal与之对应。这里面的细节,我后续还会补充。

你可能感兴趣的:(编程语言中浮点型精度损失问题(C#和Java))