java四舍五入自己写_java取四舍五入的方法

“带下划线内容无效"

两种不同方法的实现:

1:/*** 提供小数位四舍五入处理。* @param v 需要四舍五入的数字* @param scale 小数点后保留几位* @return 四舍五入后的结果*/public static double round(double v,int scale){String temp="#,##0.";for (int i=0;i;0; i--) {temp*=10;}d*=temp;long dl=Math.round(d);return (double)(dl)/temp;}

鉴于网友的的指出,我重新认真研究了一下四舍五入,最终给出正确解法如下:

import java.math.BigDecimal;

import java.text.DecimalFormat;

/**

* 本例通过对网上几种取四舍五入的研究,进行了一一测试。最终通过实验和理论得出round4为唯一正确的算法。

* 2008/10/13

*

* @author jamezhan

*

*/

public class RoundTest {

public static double round1(double v, int scale) {

if (scale < 0)

return v;

String temp = "#####0.";

for (int i = 0; i < scale; i++) {

temp += "0";

}

return Double.valueOf(new java.text.DecimalFormat(temp).format(v));

}

/**

* 该算法会出现中间运算后结果超过Double.MAX_VALUE,所以不推荐使用

* @param d

* @param scale

* @return

* @throws Exception

*/

public static double round2(double d, int scale) throws Exception {

if (scale < 0)

return d;

long temp = 1;

for (int i = scale; i > 0; i--) {

temp *= 10;

}

if (Math.abs(d * temp) > Double.MAX_VALUE)

throw new Exception("data is too big or too small");

d *= temp;

long dl = Math.round(d);

return (double) (dl) / temp;

}

public static double round3(double v, int scale) {

BigDecimal value = new BigDecimal(v);

float actualTax = value.setScale(scale, BigDecimal.ROUND_HALF_UP).floatValue();

return actualTax;

}

public static double round4(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();

}

public static void testRound1(double d, int scale) {

System.out.println("==========================");

System.out.println("data:"+ d + "; scale:"+scale);

double a = round1(d, scale);

System.out.println(a);

DecimalFormat df = new DecimalFormat();

System.out.println("formatted:"+df.format(a));

}

public static void testRound2(double d, int scale) {

try {

System.out.println("==========================");

System.out.println("data:"+ d + "; scale:"+scale);

double a = round2(d, scale);

System.out.println(a);

DecimalFormat df = new DecimalFormat();

System.out.println("formatted:"+df.format(a));

} catch (Exception e) {

System.err.println( e.getMessage() );

}

}

public static void testRound3(double d, int scale) {

try {

System.out.println("==========================");

System.out.println("data:"+ d + "; scale:"+scale);

double a = round3(d, scale);

System.out.println(a);

DecimalFormat df = new DecimalFormat();

System.out.println("formatted:"+df.format(a));

} catch (Exception e) {

System.err.println( e.getMessage() );

}

}

public static void testRound4(double d, int scale) {

try {

System.out.println("==========================");

System.out.println("data:"+ d + "; scale:"+scale);

double a = round4(d, scale);

System.out.println(a);

DecimalFormat df = new DecimalFormat();

System.out.println("formatted:"+df.format(a));

} catch (Exception e) {

System.err.println( e.getMessage() );

}

}

public static void main(String[] args) throws Exception {

System.out.println("****************************** Test round1 ******************************");

testRound1(Double.MAX_VALUE,2);

testRound1(1.264,2);

testRound1(-1.264,2);

testRound1(1.265,2);//wrong result

testRound1(-1.265,2);//wrong result

testRound1(1.266,2);

testRound1(-1.266,2);

testRound1(10224948.265,2);//wrong result

testRound1(-10224948.265,2);//wrong result

testRound1(-Double.MAX_VALUE, 2);

System.out.println("****************************** Test round2 ******************************");

testRound2(Double.MAX_VALUE,2);

testRound2(1.264,2);

testRound2(-1.264,2);

testRound2(1.265,2);//wrong result (java表示小数0.1的问题导致的 1.265表示为1.2599999904632568)

testRound2(-1.265,2);//wrong result (由于round算法是先加0.5再运算,所以d为负数时且最后一位小数为5时结果是不正确的)

testRound2(1.266,2);

testRound2(-1.266,2);

testRound2(10224948.265,2);

testRound2(-10224948.265,2);//wrong result

testRound2(-Double.MAX_VALUE, 2);

System.out.println("****************************** Test round3 ******************************");

testRound3(Double.MAX_VALUE,2);//wrong result

testRound3(1.264,2);

testRound3(-1.264,2);

testRound3(1.265,2);

testRound3(-1.265,2);

testRound3(1.266,2);

testRound3(-1.266,2);

testRound3(10224948.265,2);//wrong result

testRound3(-10224948.265,2);//wrong result

testRound3(-Double.MAX_VALUE, 2);//wrong result

System.out.println("****************************** Test round4 ******************************");

testRound4(Double.MAX_VALUE,2);

testRound4(1.264,2);

testRound4(-1.264,2);

testRound4(1.265,2);

testRound4(-1.265,2);

testRound4(1.266,2);

testRound4(-1.266,2);

testRound4(10224948.265,2);

testRound4(-10224948.265,2);

testRound4(-Double.MAX_VALUE, 2);

}

}

posted on 2006-04-25 11:38 翠竹 阅读(12665) 评论(6)  编辑  收藏 所属分类: java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,要对浮点数进行四舍五入,有几种常用的方法可以实现。首先,可以使用Math类中的round()方法。这个方法接受一个double类型的参数,并返回最接近参数的long类型值,即进行四舍五入。 另一种方法是使用BigDecimal类的setScale()方法来进行四舍五入。首先,将浮点数封装成BigDecimal对象,然后调用setScale()方法设置要保留的小数位数和舍入模式,最后使用doubleValue()方法将结果转回double类型。 还有一种方法是使用DecimalFormat类,通过设置格式化模板来实现四舍五入。可以使用setRoundingMode()方法设置舍入模式,然后使用format()方法将浮点数格式化为字符串,在使用parse()方法将字符串解析为浮点数。 总而言之,在Java中实现浮点数的四舍五入可以使用Math类的round()方法、BigDecimal类的setScale()方法以及DecimalFormat类的格式化和解析方法。具体使用哪种方法决于具体的需求和场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java基础语法(浮点数四舍五入)](https://blog.csdn.net/weixin_44387652/article/details/120866306)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [语法-Java四舍五入等详解](https://blog.csdn.net/qq_44579321/article/details/129615305)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [提供精 确的浮点数运算,包括加减乘除和四舍五入](https://download.csdn.net/download/weixin_44244991/11454556)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值