import java.math.BigDecimal;
import java.text.NumberFormat;
public class test {
public static void main(String[] args) {
long s = 2;
NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用
NumberFormat percent = NumberFormat.getPercentInstance(); //建立百分比格式化引用
/**
* BigDecimal(int) 创建一个具有参数所指定整数值的对象。
* BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
* BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
* BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
*/
/**
* add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
* subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
* multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
* divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
* toString() 将BigDecimal对象的数值转换成字符串。
* doubleValue() 将BigDecimal对象中的值以双精度数返回。
* floatValue() 将BigDecimal对象中的值以单精度数返回。
* longValue() 将BigDecimal对象中的值以长整数返回。
* intValue() 将BigDecimal对象中的值以整数返回。
*/
BigDecimal n1 = new BigDecimal(2.3);
System.out.println(currency.format(n1));
BigDecimal n2 = new BigDecimal(23);
System.out.println(currency.format(n2));
BigDecimal n3 = new BigDecimal("25");
System.out.println(currency.format(n3));
BigDecimal n4 = new BigDecimal(s);
System.out.println(currency.format(n4));
BigDecimal n5 = new BigDecimal(0.7);
System.out.println(currency.format(n5));
BigDecimal n6 = new BigDecimal(1.4);
BigDecimal r1 = n1.add(n2);
BigDecimal r2 = n1.add(n5);
BigDecimal r3 = n5.multiply(n1);
BigDecimal r4 = n6.divide(n5);
/**
* Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
* at java.math.BigDecimal.divide(BigDecimal.java:1693)
* at test.main(test.java:26)
*/
// BigDecimal r5 = n1.divide(n5);
System.out.println(currency.format(r1));
System.out.println(currency.format(r2));
System.out.println(currency.format(r3));
System.out.println(currency.format(r4));
// System.out.println(currency.format(r5));
}
}
D:\JAVA\JDK\bin\java.exe "-javaagent:D:\IDEA\idea\IntelliJ IDEA 2021.3.1\lib\idea_rt.jar=65520:D:\IDEA\idea\IntelliJ IDEA 2021.3.1\bin" -Dfile.encoding=UTF-8 -classpath D:\JAVA\JDK\jre\lib\charsets.jar;D:\JAVA\JDK\jre\lib\deploy.jar;D:\JAVA\JDK\jre\lib\ext\access-bridge-64.jar;D:\JAVA\JDK\jre\lib\ext\cldrdata.jar;D:\JAVA\JDK\jre\lib\ext\dnsns.jar;D:\JAVA\JDK\jre\lib\ext\jaccess.jar;D:\JAVA\JDK\jre\lib\ext\jfxrt.jar;D:\JAVA\JDK\jre\lib\ext\localedata.jar;D:\JAVA\JDK\jre\lib\ext\nashorn.jar;D:\JAVA\JDK\jre\lib\ext\sunec.jar;D:\JAVA\JDK\jre\lib\ext\sunjce_provider.jar;D:\JAVA\JDK\jre\lib\ext\sunmscapi.jar;D:\JAVA\JDK\jre\lib\ext\sunpkcs11.jar;D:\JAVA\JDK\jre\lib\ext\zipfs.jar;D:\JAVA\JDK\jre\lib\javaws.jar;D:\JAVA\JDK\jre\lib\jce.jar;D:\JAVA\JDK\jre\lib\jfr.jar;D:\JAVA\JDK\jre\lib\jfxswt.jar;D:\JAVA\JDK\jre\lib\jsse.jar;D:\JAVA\JDK\jre\lib\management-agent.jar;D:\JAVA\JDK\jre\lib\plugin.jar;D:\JAVA\JDK\jre\lib\resources.jar;D:\JAVA\JDK\jre\lib\rt.jar;D:\word文档\电子版练习册\JAVA\000practice\out\production\000practice;D:\word文档\电子版练习册\JAVA\000practice\src\lib\commons-io-2.11.0.jar test
¥2.30
¥23.00
¥25.00
¥2.00
¥0.70
¥25.30
¥3.00
¥1.61
¥2.00
Process finished with exit code 0
注意下面的问题
public static void main(String[] args) {
BigDecimal bigDecimal = new BigDecimal(6.6);
NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();
System.out.println(bigDecimal);
System.out.println(currencyInstance.format(bigDecimal));
}
如果这届这样使用上面的输出就是
6.5999999999999996447286321199499070644378662109375
¥6.60
在 jdk 中 double 类(float 与 int 对应)中提供了 double 与 long 转换,doubleToRawLongBits 就是将 double 转换为 long,这个方法是原始方法(底层不是 java 实现,是 c++ 实现的)。在涉及到精度计算的过程中,我们尽量使用 String 类型来进行转换。
BigDecimal 创建出来的是对象,我们不能用传统的加减乘除对其进行运算,必须使用他的方法,在我们数据库存储里,如果我们使用的是 double 或者 float 类型,需要进行来回的转换后进行计算,非常不方便。
工具类收藏
import java.math.BigDecimal;
/**
* @Author shuaige
* @Date 2022/6/13
* @Version 1.0
**/
public class BigDecimalUtils {
public static BigDecimal doubleAdd(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 floatAdd(float v1, float v2) {
BigDecimal b1 = new BigDecimal(Float.toString(v1));
BigDecimal b2 = new BigDecimal(Float.toString(v2));
return b1.add(b2);
}
public static BigDecimal doubleSub(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 floatSub(float v1, float v2) {
BigDecimal b1 = new BigDecimal(Float.toString(v1));
BigDecimal b2 = new BigDecimal(Float.toString(v2));
return b1.subtract(b2);
}
public static BigDecimal doubleMul(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 floatMul(float v1, float v2) {
BigDecimal b1 = new BigDecimal(Float.toString(v1));
BigDecimal b2 = new BigDecimal(Float.toString(v2));
return b1.multiply(b2);
}
public static BigDecimal doubleDiv(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
// 保留小数点后两位 ROUND_HALF_UP = 四舍五入
return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);
}
public static BigDecimal floatDiv(float v1, float v2) {
BigDecimal b1 = new BigDecimal(Float.toString(v1));
BigDecimal b2 = new BigDecimal(Float.toString(v2));
// 保留小数点后两位 ROUND_HALF_UP = 四舍五入
return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);
}
/**
* 比较v1 v2大小
* @param v1
* @param v2
* @return v1>v2 return 1 v1=v2 return 0 v1<v2 return -1
*/
public static int doubleCompareTo(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.compareTo(b2);
}
public static int floatCompareTo(float v1, float v2) {
BigDecimal b1 = new BigDecimal(Float.toString(v1));
BigDecimal b2 = new BigDecimal(Float.toString(v2));
return b1.compareTo(b2);
}
}