DecimalFormat數(shù)字格式化 0和# 的區(qū)別及說(shuō)明
先來(lái)介紹一下“0”和“#”的區(qū)別
1. 以“0”補(bǔ)位時(shí)
如果數(shù)字少了,就會(huì)補(bǔ)“0”,小數(shù)和整數(shù)都會(huì)補(bǔ);
如果數(shù)字多了,就切掉,但只切小數(shù)的末尾,整數(shù)不能切;
同時(shí)被切掉的小數(shù)位會(huì)進(jìn)行四舍五入處理。
2. 以“#”補(bǔ)位時(shí)
如果數(shù)字少了,則不處理,不會(huì)補(bǔ)“0”,也不會(huì)補(bǔ)“#”;
如果數(shù)字多了,就切掉,但只切小數(shù)的末尾,整數(shù)不能切;
同時(shí)被切掉的小數(shù)位會(huì)進(jìn)行四舍五入處理。
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); } }
小結(jié)一下
1. “0”強(qiáng)制按格式對(duì)齊,“#”最充足的情況下以這樣的格式對(duì)齊;
2. “#”適用的場(chǎng)景是當(dāng)小數(shù)位超過(guò)兩位時(shí),只顯示兩位,但只有一位或沒(méi)有,則不需要補(bǔ)“0”;
3. 整數(shù)位用多個(gè)“#”沒(méi)有意義。
大家想用什么樣的格式,可以自己去組裝。
DecimalFormat 數(shù)據(jù)四舍五入格式化處理
最近的開(kāi)發(fā)中,被測(cè)試的小伙伴告知,相同四舍五入處理邏輯的數(shù)據(jù)有一個(gè)有問(wèn)題。當(dāng)時(shí)的自己是懵逼的,我的處理方式是這樣的,業(yè)務(wù)要求是四舍五入保留兩位小數(shù):
DecimalFormat d = new DecimalFormat("#0.00"); d.format(0.145d);
這樣的數(shù)據(jù),期望結(jié)果是0.15,但是實(shí)際的結(jié)果是0.14,,,,,為什么呢?為什么呢?
問(wèn)題探索
對(duì)此,各種尋找原因,終于有點(diǎn)眉目,這里做大概的說(shuō)明,詳細(xì)的原因小伙伴們可以參考這篇文章
1.DecimalFormat 格式化數(shù)據(jù),如果不指定方式,默認(rèn)為HALF_EVEN,實(shí)際應(yīng)該是HALF_UP;(HALF_EVEN 被舍位是5(如保留兩位小數(shù)的2.115),后面還有非0值進(jìn)1(如保留兩位小數(shù)的2.11500001 格式化為2.12),5后面沒(méi)有數(shù)字或者都是0時(shí),前面是偶數(shù)則舍,是奇數(shù)則進(jìn)1,目標(biāo)是讓被舍前一位變?yōu)榕紨?shù)。HALF_UP:真正的四舍五入)
2. 使用BigDecimal時(shí),參數(shù)盡量傳入字符串,要比傳入double精準(zhǔn).因?yàn)閐ouble的精度容易丟失;
結(jié)果
為了不大幅度的改動(dòng)代碼,所以最后將數(shù)據(jù)格式化改為使用BigDecimal類(lèi)型:
DecimalFormat d = new DecimalFormat("#0.00"); d.setRoundingMode(RoundingMode.HALF_UP); Double.valueOf(d.format(new BigDecimal(String.valueOf(0.145d))));
因?yàn)闀r(shí)間問(wèn)題,描述的比較簡(jiǎn)單,以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 多線(xiàn)程優(yōu)先級(jí)實(shí)例詳解
這篇文章主要介紹了Java 多線(xiàn)程優(yōu)先級(jí)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04Java并發(fā)編程之柵欄(CyclicBarrier)實(shí)例介紹
這篇文章主要介紹了Java并發(fā)編程之柵欄(CyclicBarrier)實(shí)例介紹,柵欄類(lèi)似閉鎖,但是它們是有區(qū)別的,需要的朋友可以參考下2015-04-04java數(shù)據(jù)結(jié)構(gòu)排序算法之樹(shù)形選擇排序詳解
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)排序算法之樹(shù)形選擇排序,結(jié)合具體實(shí)例形式分析了java樹(shù)形選擇排序的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-05-05Object類(lèi)toString()和equals()方法使用解析
這篇文章主要介紹了Object類(lèi)toString()和equals()方法使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02關(guān)于在IDEA中SpringBoot項(xiàng)目中activiti工作流的使用詳解
這篇文章主要介紹了關(guān)于在IDEA中SpringBoot項(xiàng)目中activiti工作流的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Java中實(shí)現(xiàn)簡(jiǎn)單的Excel導(dǎo)出
今天小編就為大家分享一篇關(guān)于Java中實(shí)現(xiàn)簡(jiǎn)單的Excel導(dǎo)出,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01