先來介紹一下“0”和“#”的區別
1. 以“0”補位時
如果數字少了,就會補“0”,小數和整數都會補;
如果數字多了,就切掉,但只切小數的末尾,整數不能切;
同時被切掉的小數位會進行四舍五入處理。
2. 以“#”補位時
如果數字少了,則不處理,不會補“0”,也不會補“#”;
如果數字多了,就切掉,但只切小數的末尾,整數不能切;
同時被切掉的小數位會進行四舍五入處理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class PriceUtil { public static String decimalFormat( float value) { DecimalFormat decimalFormat; decimalFormat = new DecimalFormat(); decimalFormat.applyPattern( "0.##" ); return decimalFormat.format(value); } public static String decimalFormat( double value) { DecimalFormat decimalFormat; decimalFormat = new DecimalFormat(); decimalFormat.applyPattern( "0.##" ); return decimalFormat.format(value); } public static String decimalFormat(String value) { if (value== null ||value.isEmpty()) return "0.00" ; double d = Double.parseDouble(value); DecimalFormat decimalFormat; decimalFormat = new DecimalFormat(); decimalFormat.applyPattern( "0.##" ); return decimalFormat.format(d); } } |
小結一下
1. “0”強制按格式對齊,“#”最充足的情況下以這樣的格式對齊;
2. “#”適用的場景是當小數位超過兩位時,只顯示兩位,但只有一位或沒有,則不需要補“0”;
3. 整數位用多個“#”沒有意義。
大家想用什么樣的格式,可以自己去組裝。
DecimalFormat 數據四舍五入格式化處理
最近的開發中,被測試的小伙伴告知,相同四舍五入處理邏輯的數據有一個有問題。當時的自己是懵逼的,我的處理方式是這樣的,業務要求是四舍五入保留兩位小數:
1
2
|
DecimalFormat d = new DecimalFormat( "#0.00" ); d.format( 0 .145d); |
這樣的數據,期望結果是0.15,但是實際的結果是0.14,,,,,為什么呢?為什么呢?
問題探索
對此,各種尋找原因,終于有點眉目,這里做大概的說明,詳細的原因小伙伴們可以參考這篇文章
1.DecimalFormat 格式化數據,如果不指定方式,默認為HALF_EVEN,實際應該是HALF_UP;(HALF_EVEN 被舍位是5(如保留兩位小數的2.115),后面還有非0值進1(如保留兩位小數的2.11500001 格式化為2.12),5后面沒有數字或者都是0時,前面是偶數則舍,是奇數則進1,目標是讓被舍前一位變為偶數。HALF_UP:真正的四舍五入)
2. 使用BigDecimal時,參數盡量傳入字符串,要比傳入double精準.因為double的精度容易丟失;
結果
為了不大幅度的改動代碼,所以最后將數據格式化改為使用BigDecimal類型:
1
2
3
|
DecimalFormat d = new DecimalFormat( "#0.00" ); d.setRoundingMode(RoundingMode.HALF_UP); Double.valueOf(d.format( new BigDecimal(String.valueOf( 0 .145d)))); |
因為時間問題,描述的比較簡單,以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_40441190/article/details/85679760