2019独角兽企业重金招聘Python工程师标准>>>
System.out.println(new BigDecimal("10000000000").toString());
System.out.println( new BigDecimal("100.000").toString());
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString());
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());
输出:
10000000000
100.000
1E+2
100
BigDecimal是处理高精度的浮点数运算的常用的一个类
当需要将BigDecimal中保存的浮点数值打印出来,特别是在页面上显示的时候,就有可能遇到预想之外的科学技术法表示的问题。
一般直接使用 BigDecimal.toString()方法即可以完成浮点数的打印。如:
System.out.println( new BigDecimal("10000000000").toString());
但是,toString()方法输出的字符串并不能保证不是科学计数法。
不过在日常的使用中,用toString()方法输出的就是普通的数字字符串而非科学计数法。直接这么写:
System.out.println( new BigDecimal("100.000").toString());
程序的输出即为: 100.000
如果我们希望去除末尾多余的0,那么我们应该这么写:
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString());
其中,stripTrailingZeros()函数就是用于去除末尾多余的0的,但是此时程序的输出为: 1E+2
是科学计数法,可能并不是我们想要的。
解决的方法很简单,如果想要避免输出科学计数法的字符串,我们要用toPlainString()函数代替toString()。如:
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());
此时程序的输出就为 100
如果想要输出的是100.00 强制保留2位小数,则需要DecimalFormat。
System.out.println(new DecimalFormat("0.00").format(new BigDecimal("100.000")));
输出:
100.00
DecimalFormat中的“0” “#”意义:
Symbol Location Localized? Meaning
0 Number Yes Digit
# Number Yes Digit, zero shows as absent
简单说,0的没有的补零,#的没有就缺席没有(不显示)。
new java.text.DecimalFormat("#.###").format(3.0)
new java.text.DecimalFormat("0.000").format(3.0)
输出的结果却为: 3 和 3.000 。
BigDecimalUtils工具类
package com.imddy.tweb.util;
import java.math.BigDecimal;
import java.text.DecimalFormat;
public class BigDecimalUtils {
// 默认精度10, 应该是2,4, 特别是做金额计算,到分和到毫
public static final int DEFAULT_SCALE = 10;
public static final int DEFAULT_DIV_SCALE = 10;
// 默认的格式化字符样式 “#。00” 还可以是像“#。0000”
public static final String DEFAULT_FORMAT_STR = "#.00";
// 加法
public static BigDecimal add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2);
}
// 减法
public static BigDecimal sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2);
}
// 乘法
public static BigDecimal mul(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2);
}
// 除法,默认精度
public static BigDecimal div(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_UP);
}
// 对一个double截取指定的长度,利用除以1实现
public static BigDecimal round(double v1, int scale) {
if (scale < 0) {
new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal("1");
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);
}
// 除法,自定义精度
public static BigDecimal div(double v1, double v2, int scale) {
if (scale < 0) {
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);
}
// 比较2个double值,相等返回0,大于返回1,小于返回-1
public static int compareTo(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.compareTo(b2);
}
// 判断2个double的值相等这里要改,相等返回true,否则返回false
public static boolean valuesEquals(double v1, double v2) {
boolean result;
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
int resultInt = b1.compareTo(b2);
if (resultInt == 0) {
result = true;
} else {
result = false;
}
return result;
}
// 判断2个double的值,v1大于v2返回true,否则返回false
public static boolean valuesGreater(double v1, double v2) {
boolean result;
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
int resultInt = b1.compareTo(b2);
if (resultInt > 0) {
result = true;
} else {
result = false;
}
return result;
}
// 判断2个double的值,v1小于v2返回true,否则返回false
public static boolean valuesLess(double v1, double v2) {
boolean result;
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
int resultInt = b1.compareTo(b2);
if (resultInt < 0) {
result = true;
} else {
result = false;
}
return result;
}
// DecimalFormat格式化,使用默认的格式样式
public static String format(Object object) {
return new DecimalFormat(DEFAULT_FORMAT_STR).format(object);
}
// DecimalFormat格式化,使用传入的字符串格式样式
public static String format(Object object, String formatStr) {
return new DecimalFormat(formatStr).format(object);
}
public static void main(String[] args) {
double a = 178.63;
double b = 3.251;
System.out.println(BigDecimalUtils.add(a, b));
System.out.println(BigDecimalUtils.sub(a, b));
System.out.println(BigDecimalUtils.mul(a, b));
System.out.println(BigDecimalUtils.div(a, b));
System.out.println(BigDecimalUtils.div(a, b, 5));
// 不能以double来构建BigDecimal,只能由string来构建BigDecimal
System.out.println(new BigDecimal(Double.valueOf(a)));
System.out.println(new BigDecimal(Double.toString(a)));
System.out.println(new BigDecimal(Double.toString(a)).toString());
System.out.println(BigDecimalUtils.compareTo(a, b));
System.out.println(BigDecimalUtils.compareTo(b, a));
System.out.println(BigDecimalUtils.valuesEquals(0.002, 0.0020));
System.out.println(BigDecimalUtils.valuesGreater(a, b));
System.out.println(BigDecimalUtils.valuesLess(a, b));
//
System.out.println( BigDecimalUtils.mul(0.03, 0.0002).stripTrailingZeros().toPlainString() );
System.out.println( BigDecimalUtils.mul(0.03, 0.0002).stripTrailingZeros() );
System.out.println( BigDecimalUtils.mul(0.03, 0.0002).stripTrailingZeros().toString() );
System.out.println("----------");
System.out.println(new BigDecimal("10000000000").toString());
System.out.println( new BigDecimal("100.000").toString());
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString());
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());
System.out.println(new DecimalFormat("0.00").format(new BigDecimal("100.000")));
System.out.println(new DecimalFormat("#.00").format(new BigDecimal("100.000")));
}
}