易截截图软件、单文件、免安装、纯绿色、仅160KB

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 解析公式类

package test;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 实现对字符串表达式进行简单的包括函数的运算。
 *
 * @auth ......

利用php中的eval来模拟java中的动态代理

使用java中的动态代理可以完成很多事情,比如将业务实例进行托管,实现AOP等,但是Php中没有实现这样的东西,昨天突然想到其实可以通过eval来模拟一个动态代理机制。php比java不同的是,php是不需要编译的,因此只要我们能够动态生成一段代码,然后用eval来执行就可以达到效果。代码如下:
/**
* 代理实现类
*/
inter ......

JAVA和PHP文件操作总结

JAVA文件操作总结
File类
File f = new File(path);
path为实际路径,该路径可以是文件,或文件夹,也可以是不存在的。
f.exists() 可以判断该路是否存在。
f.isDirectory() 可以判断是否是文件夹。
f.mkdirs(); 递归创建文件夹
File和输入输出流之间纽带FileInutStream,FileOutputStream
URL url = new URL(strUr ......

java传值还是传引用

最近一直在看primer c++,函数一章对c++函数之间传递参数有详细的讲解,传值、传指针和传引用的应用与区别都讲得很清楚,
以前一直用java,由于java没有指针,当时也没有引用这个概念,所以没有对java参数的传递有过多的思考,现在搞清楚了c++
传递参数的机制,自然就会跟java进行对比,究竟java传的是什么东西?
Java代 ......

Java中实现多线程

我们不妨设想,为了创建一个新的线程,我们需要做些什么?很显然,我们必须指明这个线程所要执行的代码,而这就是在Java中实现多线程我们所需要做的一切!
    作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程。
  ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号