使用BigDecimal去掉小數(shù)點(diǎn)后無(wú)用的0
如題:BigDecimal去掉小數(shù)點(diǎn)后無(wú)用的0
比如:數(shù)據(jù)庫(kù)存儲(chǔ)的是Decimal(5,2)類型保留兩位數(shù)。
如果展示數(shù)據(jù)5.00,5.10等字樣感覺很不爽,如何做呢?
只戰(zhàn)術(shù)5和5.1
解決:BigDecimal,有方法解決stripTrailingZeros()
看源碼:
/** * Returns a string representation of this {@code BigDecimal} * without an exponent field. For values with a positive scale, * the number of digits to the right of the decimal point is used * to indicate scale. For values with a zero or negative scale, * the resulting string is generated as if the value were * converted to a numerically equal value with zero scale and as * if all the trailing zeros of the zero scale value were present * in the result. * * The entire string is prefixed by a minus sign character '-' * (<tt>'\u002D'</tt>) if the unscaled value is less than * zero. No sign character is prefixed if the unscaled value is * zero or positive. * * Note that if the result of this method is passed to the * {@linkplain #BigDecimal(String) string constructor}, only the * numerical value of this {@code BigDecimal} will necessarily be * recovered; the representation of the new {@code BigDecimal} * may have a different scale. In particular, if this * {@code BigDecimal} has a negative scale, the string resulting * from this method will have a scale of zero when processed by * the string constructor. * * (This method behaves analogously to the {@code toString} * method in 1.4 and earlier releases.) * * @return a string representation of this {@code BigDecimal} * without an exponent field. * @since 1.5 * @see #toString() * @see #toEngineeringString() */ public String toPlainString() { if(scale==0) { if(intCompact!=INFLATED) { return Long.toString(intCompact); } else { return intVal.toString(); } } if(this.scale<0) { // No decimal point if(signum()==0) { return "0"; } int tailingZeros = checkScaleNonZero((-(long)scale)); StringBuilder buf; if(intCompact!=INFLATED) { buf = new StringBuilder(20+tailingZeros); buf.append(intCompact); } else { String str = intVal.toString(); buf = new StringBuilder(str.length()+tailingZeros); buf.append(str); } for (int i = 0; i < tailingZeros; i++) buf.append('0'); return buf.toString(); } String str ; if(intCompact!=INFLATED) { str = Long.toString(Math.abs(intCompact)); } else { str = intVal.abs().toString(); } return getValueString(signum(), str, scale); } /** * Returns a {@code BigDecimal} which is numerically equal to * this one but with any trailing zeros removed from the * representation. For example, stripping the trailing zeros from * the {@code BigDecimal} value {@code 600.0}, which has * [{@code BigInteger}, {@code scale}] components equals to * [6000, 1], yields {@code 6E2} with [{@code BigInteger}, * {@code scale}] components equals to [6, -2]. If * this BigDecimal is numerically equal to zero, then * {@code BigDecimal.ZERO} is returned. * * @return a numerically equal {@code BigDecimal} with any * trailing zeros removed. * @since 1.5 */ public BigDecimal stripTrailingZeros() { if (intCompact == 0 || (intVal != null && intVal.signum() == 0)) { return BigDecimal.ZERO; } else if (intCompact != INFLATED) { return createAndStripZerosToMatchScale(intCompact, scale, Long.MIN_VALUE); } else { return createAndStripZerosToMatchScale(intVal, scale, Long.MIN_VALUE); } }
demo
public class StringUtils { public static void main(String[] args) { System.out.println(BigDecimal.ZERO); System.out.println(new BigDecimal("2.0")); System.out.println(new Double("0")); System.out.println(new BigDecimal("2.00")); String d = new BigDecimal("100.10").stripTrailingZeros().toPlainString(); System.out.println(d); System.out.println(new BigDecimal("100.10").stripTrailingZeros().toPlainString()); } }
結(jié)果:
方法二:
private static final DecimalFormat decimalFormat = new DecimalFormat("###################.###########"); public static void main(String[] args) throws Exception{ System.out.print( "格式化結(jié)果:"); System.out.println(decimalFormat.format(new BigDecimal("10.10"))); }
結(jié)果:
Java BigDecimal 小數(shù)點(diǎn)處理
保留兩位小數(shù)
方法一:
{ double c=3.154215; java.text.DecimalFormat myformat=new java.text.DecimalFormat("0.00"); String str = myformat.format(c); }
方式二:
{ java.text.DecimalFormat df =new java.text.DecimalFormat("#.00"); df.format(你要格式化的數(shù)字); 例:new java.text.DecimalFormat("#.00").format(3.1415926) #.00 表示兩位小數(shù) #.0000四位小數(shù) 以此類推... }
方式三:
{ double d = 3.1415926; String result = String .format("%.2f"); %.2f %. 表示 小數(shù)點(diǎn)前任意位數(shù) 2 表示兩位小數(shù) 格式后的結(jié)果為f 表示浮點(diǎn)型 }
四舍五入
{ double f = 111231.5585; BigDecimal b = new BigDecimal(f); //保留2位小數(shù) double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); }
public class PreciseCompute { //默認(rèn)除法運(yùn)算精度 private static final int DEF_DIV_SCALE = 10; /** * 提供精確的加法運(yùn)算。 * @param v1 被加數(shù) * @param v2 加數(shù) * @return 兩個(gè)參數(shù)的和 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精確的減法運(yùn)算。 * @param v1 被減數(shù) * @param v2 減數(shù) * @return 兩個(gè)參數(shù)的差 */ public static double sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 提供精確的乘法運(yùn)算。 * @param v1 被乘數(shù) * @param v2 乘數(shù) * @return 兩個(gè)參數(shù)的積 */ public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供(相對(duì))精確的除法運(yùn)算,當(dāng)發(fā)生除不盡的情況時(shí),精確到 * 小數(shù)點(diǎn)以后10位,以后的數(shù)字四舍五入。 * @param v1 被除數(shù) * @param v2 除數(shù) * @return 兩個(gè)參數(shù)的商 */ public static double div(double v1, double v2) { return div(v1, v2, DEF_DIV_SCALE); } /** * 提供(相對(duì))精確的除法運(yùn)算。當(dāng)發(fā)生除不盡的情況時(shí),由scale參數(shù)指 * 定精度,以后的數(shù)字四舍五入。 * @param v1 被除數(shù) * @param v2 除數(shù) * @param scale 表示表示需要精確到小數(shù)點(diǎn)以后幾位。 * @return 兩個(gè)參數(shù)的商 */ public static double div(double v1, double v2, int scale) { 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, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精確的小數(shù)位四舍五入處理。 * @param v 需要四舍五入的數(shù)字 * @param scale 小數(shù)點(diǎn)后保留幾位 * @return 四舍五入后的結(jié)果 */ public static double round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal ne = new BigDecimal("1"); return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } }
my code:
private BigDecimal formatComma2BigDecimal(Object obj) { String val = String.valueOf(obj); if (val == null) return new BigDecimal("0.00"); val = val.replaceAll(",", ""); if (!isNumber(val)) return new BigDecimal("0.00"); BigDecimal decimal = new BigDecimal(val); decimal = decimal.setScale(2, RoundingMode.HALF_UP); return decimal; } private String formatCommaAnd2Point(Object obj) { BigDecimal decimal = formatComma2BigDecimal(obj); DecimalFormat df = new DecimalFormat("#,###.00"); String decimalStr = df.format(decimal).equals(".00")?"0.00":df.format(decimal); if(decimalStr.startsWith(".")){ decimalStr = "0"+decimalStr; } return decimalStr; } private boolean isDouble(String value) { try { Double.parseDouble(value); if (value.contains(".")) return true; return false; } catch (NumberFormatException e) { return false; } } private boolean isInteger(String value) { try { Integer.parseInt(value); return true; } catch (NumberFormatException e) { return false; } } private boolean isNumber(String value) { return isInteger(value) || isDouble(value); }
詳細(xì)還是參看JavaSE 幫助文檔吧~以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Cloud負(fù)載均衡及遠(yuǎn)程調(diào)用實(shí)現(xiàn)詳解
這篇文章主要介紹了Spring Cloud負(fù)載均衡及遠(yuǎn)程調(diào)用實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08SpringBoot實(shí)現(xiàn)文件上傳與下載功能的示例代碼
文件上傳與下載是Web應(yīng)用開發(fā)中常用的功能之一。接下來(lái)我們將討論如何在Spring?Boot的Web應(yīng)用開發(fā)中,如何實(shí)現(xiàn)文件的上傳與下載,感興趣的可以了解一下2022-06-06詳解SpringBoot同時(shí)可以處理多少請(qǐng)求
在日常操作中,相信很多人在SpringBoot能同時(shí)處理多少請(qǐng)求問(wèn)題上存在疑惑,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2024-06-06基于SpringBoot和Vue3的博客平臺(tái)的用戶注冊(cè)與登錄功能實(shí)現(xiàn)
本教程將指導(dǎo)您如何使用Spring?Boot和Vue3實(shí)現(xiàn)用戶注冊(cè)與登錄功能。我們將使用Spring?Boot作為后端框架,Vue3作為前端框架,同時(shí)使用MySQL作為數(shù)據(jù)庫(kù),感興趣的朋友可以參考一下2023-04-04Java?20在Windows11系統(tǒng)下的簡(jiǎn)易安裝教程
這篇文章主要給大家介紹了關(guān)于Java?20在Windows11系統(tǒng)下的簡(jiǎn)易安裝教程,學(xué)習(xí)Java的同學(xué),第一步就是安裝好Java環(huán)境,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07spring boot 使用Aop通知打印控制器請(qǐng)求報(bào)文和返回報(bào)文問(wèn)題
這篇文章主要介紹了spring-boot 使用Aop通知打印控制器請(qǐng)求報(bào)文和返回報(bào)文,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法
本文主要介紹了java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05