四舍五入的问题,有这么难吗?

flai 2005-09-19 03:55:47
目的:
四舍五入,保留两个小数点

定义方法一:

public static double round(double value,int n){

String strFormat="#0.";
for(int i=0;i<n;i++)
{
strFormat += "#";
}
DecimalFormat df = new DecimalFormat(strFormat);
String strNew = df.format(value,new StringBuffer(),new FieldPosition(0)).toString();
return Double.parseDouble(strNew);
}

该函数对于绝大多数的处理结果都是对的,但是有一些例外,如

System.out.println(Class1.round(7.985,2));
输出结果为: 7.98
System.out.println(Class1.round(103.805,2));
输出结果为: 103

方法二:

public static double round(double value,int n){

return new BigDecimal(var).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
}

该函数对于绝大多数的处理结果都是对的,但是有一些例外,如

System.out.println(Class1.round(7.055,2));
输出结果为: 7.05



走过路过的大侠,帮我看看这是为什么?
...全文
228 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzh1980 2005-10-10
  • 打赏
  • 举报
回复
顶。。。
kingdoom 2005-09-19
  • 打赏
  • 举报
回复
帮顶
cnyxlxw 2005-09-19
  • 打赏
  • 举报
回复
mark!!!
mysohu 2005-09-19
  • 打赏
  • 举报
回复
关注
Willam2004 2005-09-19
  • 打赏
  • 举报
回复
关注!
flai 2005-09-19
  • 打赏
  • 举报
回复
To congliu(取次花丛都不顾,半缘修道半缘君。) :

用了你提供的类,目前还没发现问题

请问一下:为什么我定义的方法会有问题呢?
raymond19840709 2005-09-19
  • 打赏
  • 举报
回复
干么就不用Math下的四舍五入呢?自己控制下格式就行拉
congliu 2005-09-19
  • 打赏
  • 举报
回复
java实现精确的"四舍五入"

import java.math.BigDecimal;
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();

}


}
flai 2005-09-19
  • 打赏
  • 举报
回复
修正一下:

System.out.println(Class1.round(103.805,2));
输出结果为: 103.8

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧