float、Float、double都不靠谱

public static void main(String[] args) {
    float a = 16777216.0f;
    System.out.println(a);
    float b = 1.0f;
    float c = a + b; // Noncompliant; yields 1.6777216E7 not 1.6777217E7

    double d = a + b; // Noncompliant; addition is still between 2 floats

    System.out.println("c:"+c + " d:" + d);

    Float a0 = 16777216.0f;
    System.out.println(a);
    Float b0 = 1.0f;
    Float c0 = a0 + b0; // Noncompliant; yields 1.6777216E7 not 1.6777217E7

    double d0 = a0 + b0; // Noncompliant; addition is still between 2 floats

    System.out.println("c0:"+c0 + " d0:" + d0);

    double a1 = 16777219.0f;
    double b1 = 1.0f;

    double d1 = a1 + b1;

    System.out.println("d1:" + d1);//noncompliant: yields 1.6777221E7 not 1.6777220E7

    Double a10 = 16777219.0d;
    Double b10 = 1.0d;

    Double d10 = a10 + b10;

    System.out.println("d10:" + d10);//正确

    BigDecimal a2 = new BigDecimal(16777219.0);
    BigDecimal b2 = new BigDecimal(2.0);
    BigDecimal c2 = a2.add(b2) ;//正确

    System.out.println("c2 = "+c2 );
}

从上面的测试看,float,Float, double 计算结果都出问题了。用Double和BigDecimal计算没有问题。

结论:小数的情况,如果值比较大,使用Double和BigDecimal定义,计算能保证正确。

Double dd1 = 10.0d;
Double dd2 = 9.98d;

System.out.println(dd1 - dd2);  //0.019999999999999574

这样计算结果也有点问题啊。看来Double也不靠谱

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值