欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

带百分号数值转小数

程序员文章站 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