带百分号数值转小数
程序员文章站
2022-07-10 21:43:45
需求是将带有百分号的数值转化为小数,例如 20%–>0.21、网上关于这种解决办法有很多帖子,最常见:public static void dataFormat(String string) { NumberFormat numberFormat = NumberFormat.getPercentInstance(); try { Number n1 = numberFormat.parse(string); Sys...
需求是将带有百分号的数值转化为小数,例如 20%–>0.2
1、网上关于这种解决办法有很多帖子,最常见:
public static void dataFormat(String string) {
NumberFormat numberFormat = NumberFormat.getPercentInstance();
try {
Number n1 = numberFormat.parse(string);
System.out.println(n1.floatValue());
} catch (Exception e) {
e.printStackTrace();
}
}
引用NumberFormat会直接进行转换,本以为很方便,没想到有个陷阱;当入参为0.02%的时候,结果为2.0E-4,科学计数法,实际应用受影响而导致参数异常问题。
继续解决科学计数法问题:
NumberFormat numberFormat = NumberFormat.getPercentInstance();
try {
Number n1 = numberFormat.parse(string);
System.out.println(n1.floatValue());
BigDecimal bd= new BigDecimal(n1.doubleValue());
System.out.println(bd.toPlainString());
} catch (Exception e) {
e.printStackTrace();
}
}
本以为到此解决,没想到BigDecimal也会有精度问题
继续解决精度问题
BigDecimal bd= new BigDecimal(n1.doubleValue()).setScale(4, BigDecimal.ROUND_HALF_UP);;
问题解决。
2、简单粗暴的解决方式
public static void dataFormat2(String string){
if(string==null){
return ;
}
String str=string.replace("%","");
BigDecimal bg=new BigDecimal(str);
BigDecimal persent =new BigDecimal("100");
BigDecimal re=bg.divide(persent,4, RoundingMode.HALF_UP);
System.out.println(re);
}
问题解决。
上述代码逻辑并不严谨,只关注问题解决。
本文地址:https://blog.csdn.net/weixin_44082875/article/details/110117935