浮点数和定点数

浮点数的比较是一个普遍存在的问题,下面的程序片断中对两个浮点数做减法运算:

public class Test {
public static void main(String[] args) throws Exception {
System.out.print("6.22-6.0=" + (6.22f-6.0f)); }
}

对上面 Java 程序的输出结果可能会想当然的认为是 0.22,但是,实际结果却是0.21999979,因此,在编程中应尽量避免浮点数的比较,如果非要使用浮点数比较则最好使用范围比较而不要使用“==”比较。

再看一下使用定点数来实现上面的例子:



public class Test {
public static void main(String[] args) throws Exception {
System.out.print("6.22-6.0=" + subtract(6.22,6.0)); }
public static double subtract(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue(); }
}

上面的实例使用 Java BigDecimal 类实现了定点数的精确计算,所以 6.22 7.0 的结果和预想的相同,为 6.22-6.0=0.22


注意:在今后关于浮点数和定点数的应用中,用户要考虑到以下几个原则:
浮点数存在误差问题;
对货币等对精度敏感的数据,应该用定点数表示;
在编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较; 要注意浮点数中一些特殊值的处理。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值