您的位置:首页 > 其它

使用BigDecimal(避免E科学计数法)四舍五入和百分比四舍五入保留2位小数

2017-11-28 17:47 956 查看
package com.winner.kl.entity.vo.V3;

import java.math.BigDecimal;

/**
* @author wangxl
* @date 2017-11-27
*/
public class BigDecimalTest {

public static void main(String[] args) {
java.math.BigDecimal bd1 = new java.math.BigDecimal(0.145444444444444444444);//0.15
String s = bd1.setScale(2, java.math.BigDecimal.ROUND_HALF_UP).toPlainString();
System.out.println(s);

double num1 = 50123.12E25;
System.out.println(num1);//打印出5.012312E29
BigDecimal bd = new BigDecimal(num1);
System.out.println(bd.toPlainString());//不带小数点501231200000000030561980645376
System.out.println(bd);//和上面一样 不带小数点501231200000000030561980645376
BigDecimal bigDecimal = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(bigDecimal);////打印siteScale的返回值才能拿到保留2位小数的值或用下面的.toPlainString()
System.out.println("我我我哦我哦喔喔噢噢" + ""+bd.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());

java.math.BigDecimal a = new java.math.BigDecimal("1.35");
//    取一位小数,直接删除后面多余位数,故取值1.3.
a.setScale(1, java.math.BigDecimal.ROUND_DOWN);

//    取一位小数,删除后面位数,进一位,故取值1.4.
a.setScale(1, java.math.BigDecimal.ROUND_UP);

//    取一位小数,四舍五入,故取值1.4.
a.setScale(1, java.math.BigDecimal.ROUND_HALF_UP);

//    取一位小数,五舍六入,故取值1.3.   ROUND_HALF_DOWN表示遇5不进1(即1.5保留小数点0位是1)(13.5502中保留1位,比较的是0.0502比5大,所以进一位13.6);
a.setScale(1, java.math.BigDecimal.ROUND_HALF_DOWN);

java.math.BigDecimal bd2 = new java.math.BigDecimal(0.145444444444444444444);//0.145444444444444431763230340948211960494518280029296875

String s2 = bd2.toPlainString();
System.out.println(s2);

/*BigDecimal在创建的时候可以传入String和double,但是最好使用String,至于原因看看如下代码就知道了:
复制代码 代码如下:
BigDecimal b = new BigDecimal("12.000001");
System.out.println(b);
BigDecimal c = new BigDecimal(12.01);
System.out.println(c);

运行结果为:
12.000001
12.0099999999999997868371792719699442386627197265625
可以看出在传入double的时候精度会丢失。*/

java.math.BigDecimal b = new java.math.BigDecimal("12.000001");
System.out.println(b);
java.math.BigDecimal b1 = new java.math.BigDecimal("11.00");
java.math.BigDecimal b2 = new java.math.BigDecimal("12.00");
//加减乘除
java.math.BigDecimal add = b1.add(b2);
java.math.BigDecimal subtract = b1.subtract(b2);
java.math.BigDecimal multiply = b1.multiply(b2);
BigDecimal divide = b1.divide(b2, 2, BigDecimal.ROUND_HALF_DOWN);// BigDecimal.ROUND_HALF_UP 表示四舍五入的规则
}

/*public static void main(String[] args) {
//百分比四舍五入保留2位小数
Double today = Double.valueOf(inToday);
Double last = Double.valueOf(inLast);

//方案1是不满足百分比保留2位小数的,返回的值是0.03这样的不带%,推荐用方案2:这里也用BigDecimal构造,两个double除完后,将double转为BigDecimal,然后bd.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString();就保留了2位小数
//double v = (today - last) / last;
//java.math.BigDecimal bd = new java.math.BigDecimal(v);//将double转为BigDecimal
//bd.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()

//百分比四舍五入
NumberFormat nt = NumberFormat.getPercentInstance();
nt.setRoundingMode(RoundingMode.HALF_UP);////设置为4舍五入,如果RoundingMode.UP不管是0.14441都是进位14.45%
nt.setMinimumFractionDigits(2);
String format = nt.format(0.14441444);
System.out.println(format);
}*/
}

Double today = Double.valueOf(inToday);
Double last = Double.valueOf(inLast);
NumberFormat nt = NumberFormat.getPercentInstance();
nt.setRoundingMode(RoundingMode.HALF_UP);//设置为4舍五入,如果RoundingMode.UP不管是0.14441都是进位14.45%
nt.setMinimumFractionDigits(2);
double v = today - last;
if (v == 0.00) {
return "0.00%";
}
return nt.format((today - last) / (double)last);//除以0.0自动返回∞%(不带+号)  如果分子为0自动返回0.00%
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐