java ==陷阱_JAVA 精确计算时的陷阱 troy

JAVA 精确计算时的陷阱

troy

在java.math包中有个BigDecimal类,通过这个类可以进行精确计算. 我们知道BigDecimal有个setScale(int 精度,int 舍入模式)方法,随之而来问题出现了,当运行如下代码时:

/**

* @author troy(J2EE)

* @version 1.0

*/

import java.math.*;

public class Test{

public static void  main(String[] args){

//精度为2,四舍五入模式

BigDecimal  a =new BigDecimal(0.825).setScale(2, BigDecimal.ROUND_HALF_UP);

System.out.println(a);

}

}

却惊奇地打印出结果:

0.82

Oh My God,对0.825进行小数点后保留2位有效数字,四舍五入后结果应该是:0.83。为什么打印结果是0.82?

没错BigDecimal(double val)这个构造器欺骗了我们,它使用了0.825的近似值(0.8249999999999……)来构造BigDecimal。

为什么会这样?

原来JAVA存储浮点数(float、double)时,使用的是IEEE754标准,每个浮点数使用的是 符号位、阶码、尾数来表示:

````````符号位  阶码   尾数    长度

float     1      8     23    32

double    1     11     52    64

通过这种方法保存在计算机里面的浮点数,实际上是它的近似值。举例说明问题:

定义一个double 38414.4,将它转换为16进制。我们先计算整数部分38414等于960E。小数处理:0.4=0*0.5+0.25*1+0.0625*0+……,实际上我们永远计算不完。

结论:当我们定义一个浮点数时,请告诉自己,我们定义只不过是这个浮点数的近似值,即0.825!=0.825。

为了避免这个问题,我们应该使用如下方法:

/**

* @author troy(J2EE)

* @version 1.0

*/

import java.math.*;

public class Test{

public static void  main(String[] args){

BigDecimal  a =new BigDecimal("0.825").setScale(2, BigDe

相关文档:

JAVA文件操作总结

File类

File f = new File(path);

path为实际路径,该路径可以是文件,或文件夹,也可以是不存在的。

f.exists() 可以判断该路是否存在。

f.isDirectory() 可以判断是否是文件夹。

f.mkdirs(); 递归创建文件夹

File和输入输出流之间纽带FileInutStream,FileOutputStream

URL url = new URL(strUr ......

php和java通用sql语句法

SELECT max(id) from table

该方法在多线程等情况下可能会造成不正确。

java三种方法

1、根据ps的getGeneratedKeys

PreparedStatement ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); //红色是关键

ps.executeUpdate(); //执行后

ResultSet rs = ps.getGeneratedKeys ......

System.out.println(2.00 -1.10);//0.8999999999999999

上面的计算出的结果不是0.9,而是一连串的小数。问题在于1.1 这个数字不能被精确表示

为一个double,因此它被表示为最接近它的double 值,该程序从2 中减去的就是这个值,

但这个计算的结果并不是最接近0.9 的double值。

一般地说,问题在于并不是所有的小数都可� ......

Graphics2D arg;

float thick=3.0f;

arg1.setStroke(new BasicStroke(thick, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND));

arg1.drawLine(first.x, first.y, next.x, next.y);

arg1.setColor(Color.red);

......

单态定义:

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage c ......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值