如果是四舍五入的话总觉得会不正确。
解决方案 »
- 关于java弹出对话框的问题
- ^_^散分了~~顺便纠正一个容易犯的小错误^_^
- 关于static 和单例模式的问题
- JDBC实现分页
- 在sco unix或linux 安装j2sdk-1_3_1_09-linux-i586.bin 出现以下错误
- 有没有象样点的Java多媒体方面的论坛或网站?CSDN不可以开吗?
- Calendar.getInstance() 與new Calendar()產生的對象有什麼區別?
- 可视化设计写bmp的一些问题!
- 在JB5中,当弹出消息提示后,按下确定,我采用输入框的requestFocus(),以使其能获得输入焦点,但不行。应怎样使输入框获得焦点,高手请指
- 请给小弟讲一下这道题的意思!
- JAVA的Jar 和 package的问题,大家指点一下!!
- 哪位高手举个经典的多态的例子
public class Arith
{
private static final int DEF_DIV_SCALE = 10; private Arith()
{ }
/** * 提供精确的加法运算。 * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public static double add(double v1,double v2)
{ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 * @param v1 被减数 * @param v2 减数 * @return 两个参数的差 */ public static double sub(double v1,double v2)
{ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); }
/** * 提供精确的乘法运算。 * @param v1 被乘数 * @param v2 乘数 * @return 两个参数的积 */ public static double mul(double v1,double v2)
{ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); }
/** * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 * 小数点以后10位,以后的数字四舍五入。 * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 */ public static double div(double v1,double v2)
{ return div(v1,v2,DEF_DIV_SCALE); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 * 定精度,以后的数字四舍五入。 * @param v1 被除数 * @param v2 除数 * @param scale 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */ public static double div(double v1,double v2,int scale)
{ if(scale<0)
{ throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精确的小数位四舍五入处理。 * @param v 需要四舍五入的数字 * @param scale 小数点后保留几位 * @return 四舍五入后的结果 */ public static double round(double v,int scale){ if(scale<0)
{ throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); }
}
(代码来自google 搜索)
以上代码是解决这类问题的//***************原因是机器的精确度问题,通常电脑计算方法不是我们通常用的方法.
就好象现在有很多高级计算器一样,他们解方程并不是我们通常用的
解方程公式,而且比较复杂的"逼近"方法,
strictfp void f() {}
}2. 错误的使用方法interface A {
strictfp void f();
}public class FpDemo2 {
strictfp FpDemo2() {}
}一旦使用了关键字strictfp来声明某个类、接口或者方法时,那么在这个关键字所声明的范围内所有浮点运算都是精确的,符合IEEE-754规范的。例如一个类被声明为strictfp,那么该类中所有的方法都是strictfp的。
变成float 40.0*0.05=1.9000000000000001,行不?
public static void main(String[] args){
f1();
f2();
}
strictfp static void f1(){
System.out.println(1.003*1000);//outputs "1002.9999999999999"
}
static void f2(){
System.out.println(1.003*1000);//outputs "1002.9999999999999"
}
}strictfp 关键字在这种地方好像没用