java保留2位小數及BigDecimal使用
轉自 https://blog.csdn.net/mglgcx/article/details/78560029?locationNum=10&fps=1
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class NumberFormatDemo {
public static void main(String[] args) {
// BigDecimal
// 保留兩位小數
System.out.println(new BigDecimal(0.2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.2
System.out.println(new BigDecimal(0.235).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.23
System.out.println(new BigDecimal(0.2351).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.24
System.out.println(new BigDecimal(42).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 42.0
// NumberFormat
// 保留兩位小數,個位無數字填充0
NumberFormat nformat = NumberFormat.getNumberInstance();
nformat.setMaximumFractionDigits(2);
System.out.println(nformat.format(0.2));// 0.2
System.out.println(nformat.format(0.235));// 0.23
System.out.println(nformat.format(0.2351));// 0.24
System.out.println(nformat.format(42));// 42
// DecimalFormat,是NumberFormat的具體實現子類
// 保留兩位小數,對應位上無數字填充0
DecimalFormat df = new DecimalFormat("#0.00");
System.out.println(df.format(0.2));// 0.20
System.out.println(df.format(0.235));// 0.23
System.out.println(df.format(0.2351));// 0.2, 因為0.2351在0.23-0.24之間,距離0.24更近,所以輸出0.24
System.out.println(df.format(42));// 42.00
DecimalFormat df4 = new DecimalFormat();
// #:位置上無數字不顯示
df4.applyPattern("#.##");
System.out.println(df4.format(345235.0));// 345235
// 0:位置上無數字顯示0
df4.applyPattern("0.00");
System.out.println(df4.format(345235.0));// 345235.00
// 加負數顯示
df4.applyPattern("-0.00");
System.out.println(df4.format(345235.34567));// -345235.35
// 逗號分隔
df4.applyPattern("-0,000.00");
System.out.println(df4.format(345235.34567));// -345,235.35
// 百分位
df4.applyPattern("0.00%");
System.out.println(df4.format(0.34567));// 34.57%
// 千分位
df4.applyPattern("0.00\u2030");
System.out.println(df4.format(0.34567));// 345.67‰
// 科學計數法,E之前是底數的格式,E之後的是指數的格式
df4.applyPattern("0.00E00");
System.out.println(df4.format(2342.444));// 2.34E03
// 格式後面加單位符號
df4.applyPattern("0.00 KG");
System.out.println(df4.format(2342.444));// 2342.44 KG
df4.applyPattern("0.00 QA");
System.out.println(df4.format(2342.444));// 2342.44 QA
// 使用舍入模式:ROUND_HALF_EVEN,
// 保留位數是奇數,使用ROUND_HALF_DOWN
// 保留位數是偶數,使用ROUND_HALF_UP
System.out.println(df4.format(2342.435));// 2342.43 QA
System.out.println(df4.format(2342.445));// 2342.45 QA
// String.format
// 保留兩位小數,個位數及小數點後兩位無數字填充0,四捨五入
System.out.println(String.format("%.2f", 0.2));// 0.20
System.out.println(String.format("%.2f", 0.235));// 0.24
System.out.println(String.format("%.2f", 0.236));// 0.24
System.out.println(String.format("%.2f", 42.0));// 42.00
}
}
BigDecimal工具類
總所周知,java在浮點型運算時是非精確計算,如下demo
System.out.println(0.05 + 0.01);// 0.060000000000000005
System.out.println(1.0 - 0.42);// 0.5800000000000001
System.out.println(4.015 * 100);// 401.49999999999994
System.out.println(123.3 / 100);// 1.2329999999999999
在商業運算中,這點微小的誤差有可能造成非常嚴重的後果。
所以在商業應用開發中,涉及金額等浮點數計算的資料,全部使用BigDecimal進行加減乘除計算
BigDecimal工具類程式碼:
import java.math.BigDecimal;
public class BigDecimalUtil {
// 預設除法運算精度
private static final int DEFAULT_DIV_SCALE = 5;
/**
* 提供精確的加法運算
*
* @param v1
* @param v2
* @return
*/
public static double add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.add(b2).doubleValue();
}
public static String add(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.add(b2).toString();
}
/**
* 提供精確的減法運算
*
* @param v1
* @param v2
* @return
*/
public static double subtract(double v1, double v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).doubleValue();
}
public static String substract(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).toString();
}
/**
* 提供精確的乘法運算
*
* @param v1
* @param v2
* @return
*/
public static double multiply(double v1, double v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).doubleValue();
}
public static String multiply(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).toString();
}
/**
* 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 小數點以後10位,以後的數字四捨五入,舍入模式採用ROUND_HALF_UP
*
* @param v1
* @param v2
* @return 兩個引數的商
*/
public static double divide(double v1, double v2) {
return divide(v1, v2, DEFAULT_DIV_SCALE);
}
/**
* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale引數指 定精度,以後的數字四捨五入。舍入模式採用ROUND_HALF_UP
*
* @param v1
* @param v2
* @param scale
* 表示需要精確到小數點以後幾位。
* @return 兩個引數的商
*/
public static double divide(double v1, double v2, int scale) {
return divide(v1, v2, scale, BigDecimal.ROUND_HALF_UP);
}
/**
* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale引數指 定精度,以後的數字四捨五入。舍入模式採用使用者指定舍入模式
*
* @param v1
* @param v2
* @param scale
* 表示需要精確到小數點以後幾位
* @param round_mode
* 表示使用者指定的舍入模式
* @return 兩個引數的商
*/
public static double divide(double v1, double v2, int scale, int round_mode) {
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, round_mode).doubleValue();
}
/**
* 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 小數點以後10位,以後的數字四捨五入,舍入模式採用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @return 兩個引數的商,以字串格式返回
*/
public static String divide(String v1, String v2) {
return divide(v1, v2, DEFAULT_DIV_SCALE);
}
/**
* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale引數指 定精度,以後的數字四捨五入。舍入模式採用ROUND_HALF_UP
*
* @param v1
* @param v2
* @param scale
* 表示需要精確到小數點以後幾位
* @return 兩個引數的商,以字串格式返回
*/
public static String divide(String v1, String v2, int scale) {
return divide(v1, v2, scale, BigDecimal.ROUND_HALF_UP);
}
/**
* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale引數指 定精度,以後的數字四捨五入。舍入模式採用使用者指定舍入模式
*
* @param v1
* @param v2
* @param scale
* 表示需要精確到小數點以後幾位
* @param round_mode
* 表示使用者指定的舍入模式
* @return 兩個引數的商,以字串格式返回
*/
public static String divide(String v1, String v2, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.divide(b2, scale, round_mode).toString();
}
/**
* 提供精確的小數位四捨五入處理,舍入模式採用ROUND_HALF_EVEN
*
* @param v
* 需要四捨五入的數字
* @param scale
* 小數點後保留幾位
* @return 四捨五入後的結果
*/
public static double round(double v, int scale) {
return round(v, scale, BigDecimal.ROUND_HALF_UP);
}
/**
* 提供精確的小數位四捨五入處理
*
* @param v
* 需要四捨五入的數字
* @param scale
* 小數點後保留幾位
* @param round_mode
* 指定的舍入模式
* @return 四捨五入後的結果
*/
public static double round(double v, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
return b.setScale(scale, round_mode).doubleValue();
}
/**
* 提供精確的小數位四捨五入處理,舍入模式採用ROUND_HALF_UP
*
* @param v
* 需要四捨五入的數字
* @param scale
* 小數點後保留幾位
* @return 四捨五入後的結果,以字串格式返回
*/
public static String round(String v, int scale) {
return round(v, scale, BigDecimal.ROUND_HALF_UP);
}
/**
* 提供精確的小數位四捨五入處理
*
* @param v
* 需要四捨五入的數字
* @param scale
* 小數點後保留幾位
* @param round_mode
* 指定的舍入模式
* @return 四捨五入後的結果,以字串格式返回
*/
public static String round(String v, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(v);
return b.setScale(scale, round_mode).toString();
}
}
- BigDecimal 舍入模式(Rounding mode)介紹:
- ROUND_CEILING
向正無窮方向舍入
- ROUND_DOWN
向零方向舍入
- ROUND_FLOOR
向負無窮方向舍入
- ROUND_HALF_DOWN
向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,如果是這樣,向下舍入, 例如1.55 保留一位小數結果為1.5
- ROUND_HALF_EVEN
向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,如果是這樣,如果保留位數是奇數,使用: : ROUND_HALF_DOWN如果是偶數,使用ROUND_HALF_UP
- ROUND_HALF_UP
向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,如果是這樣,向上舍入, 1.55保留一位小數結果為1.6
- ROUND_UNNECESSARY
計算結果是精確的,不需要舍入模式
- ROUND_UP
向遠離0的方向舍入
相關文章
- hutool jsonutil BigDecimal 保留小數點處理JSONDecimal
- Java大數相乘(使用BigInteger和BigDecimal)JavaDecimal
- Java BigDecimal使用指南JavaDecimal
- BigDecimal加減乘除運算,保留2位小數點,初始化,與0的比較Decimal
- Android&Java保留小數位數的幾種寫法AndroidJava
- oracle保留兩位小數Oracle
- C++保留有效位與保留小數位C++
- Python中怎麼保留小數?Python
- JavaScript浮點數保留兩位小數JavaScript
- JavaScript保留兩位或者其他位數小數JavaScript
- android kotlin 小數保留格式化位數AndroidKotlin
- Java中BigDecimal的使用(1.01+2.02=3.0300000000000002)JavaDecimal
- js-正負數保留小數點特定位數JS
- java中的BigDecimalJavaDecimal
- 影片直播app原始碼,EditText保留小數位數APP原始碼
- mysql格式化小數保留小數點後兩位(小數點格式化)MySql
- MySQL保留幾位小數的4種方法MySql
- (Java筆記)BigDecimal類Java筆記Decimal
- Java之BigDecimal詳解JavaDecimal
- iOS小數點格式化:最多保留兩位小數,小數點後末尾的0不要iOS
- PHP 保留小數點後有效數字(四捨五入)PHP
- Python保留兩位小數五種常用的方法!Python
- 前端保留兩位小數toFixed(2)會有坑前端
- jdk8之stream求和,保留兩位小數JDK
- Java 中比較 BigDecimal 的陷阱JavaDecimal
- Java的BigDecimal比較大小JavaDecimal
- Math類產生隨機數後保留一位小數隨機
- BigDecimal使用注意的地方Decimal
- 通過計算機語言自定義保留小數計算機
- Python如何保留float型別小數點後3位Python型別
- Java計算百分比保留整數Java
- 手機直播原始碼,flutter 隨機數的生成和保留兩位小數原始碼Flutter隨機
- input限制只能輸入整數或保留小數點後2位的浮點數
- Java-物件及變數的併發訪問小結Java物件變數
- python 使用 round 方法保留 1 位和 2 位小數時沒有進行四捨五入Python
- Vue中使用js實現保留小數的奇入偶不入,四捨六入的計算VueJS
- BigDecimalDecimal
- java變數及常量Java變數