字符串类型的小数转换成double类型的小数值(面试题)

自己编写算法,将一个字符串类型的小数,转换成double类型的小数。
比喻:"15.246"转换成15.246,不能使用系统提供的Integer.parseInt和Double.parseDouble等方法。

嗯,这个确实可以实现,转换成int类型就简单了。但是,小数怎么办?
以小数点为分隔符,切割成两个字符串,然后各自转换成int类型,然后再后期处理成double即可。
嗯,理解。简单了,下面开始描述性的演示"15.246"例子:

String str = "15.246";

先以小数点为分隔符,拆分成两个子字符串:
String[] arr = str.split("\\.");
注意上面步骤,为什么split时,需要\\符号?因为split的参数是正则表达式,正则中的.代表什么?自己去查一查吧。


在正则中
\\.表示字符.
\\\\表示字符串\\


那么arr数组的内容就是{"15","246"},我们先只考虑同时包含整数小数的情况


字符串"15"如何转换成int类型的15?
十位值 = ('1' - '0') * 10 = 10
个位值 = ('5' - '0') * 1 = 5
总和 = 15
注意,每个位上的数字,需要乘以位的单位。


同样的步骤,小数部分也得到了对应的int值246,然后想办法让246转换成0.246.
最后结果 = 15 + 0.246 = 15.246。
大致思路如上,我们开始撸点代码:
 

/**
 *@Author:759057893@qq.com Lyz
 *@Date: 2019/7/13 14:20
 *@Description:
 **/
public class ConvertToDouble {
    public static void main(String[] args) {
        String strDouble = "-12.25";
        double result = toDouble(strDouble);
        System.out.println(result);
    }

    private static double toDouble(String str) {
        if (str == null || "".equals(str.trim())) {
            return 0;
        }
        str = str.trim();
        boolean isMinus = false;
        if (str.startsWith("-")) {
            //是负数
            isMinus = true;
            //去除负号
            str = str.substring(1);
        }
        //整个字符串直面值结果
        double result = 0;
        //先把字符串的小数,以小数点分割切开成两部分小数(注意正则)
        String[] strNumArr = str.split("\\.");
        //先处理整数部分的数字,转换成int数字
        int intNumResult = 0;
        for (int i = 0; i < strNumArr[0].length(); i++) {
            int val = strNumArr[0].charAt(i) - '0';
            if (val < 0 || val > 9) {
                //非数字
                intNumResult /= 10;
                continue;
            }
            //获得当前字符的字面整数值,然后乘以当前位的进制值
            intNumResult += val * makeInteger10N(strNumArr[0].length() - i - 1);
        }
        //存储小数部分的整数值
        int decimalNumResult = 0;
        if (strNumArr.length > 1) {
            //记录非法字符个数
            int numNaN = 0;
            //strNumArr数组的长度大于1,证明原始字符串有小数部分
            for (int i = 0; i < strNumArr[1].length(); i++) {
                int val = strNumArr[1].charAt(i) - '0';
                if (val < 0 || val > 9) {
                    //非数字
                    decimalNumResult /= 10;
                    numNaN++;
                    continue;
                }
                //获得当前字符的字面整数值,然后乘以当前位的进制值
                decimalNumResult += val * makeInteger10N(strNumArr[1].length() - i - 1);
            }
            //保存小数部分最终结果
            result = decimalNumResult * makeDecimal01N(strNumArr[1].length() - numNaN);
        }
        //加上之前的整数部分
        result += intNumResult;
        //加上数值负号
        if (isMinus) {
            result *= -1;
        }
        return result;
    }

    /**
     * 构造10的n倍数
     *
     * @return
     */
    private static int makeInteger10N(int n) {
        int i = 1;
        for (int j = 0; j < n; j++) {
            i *= 10;
        }
        return i;
    }
    /**
     * 构造小数n个10分之一
     *
     * @return
     */
    private static double makeDecimal01N(int n) {
        double i = 1;
        for (int j = 0; j < n; j++) {
            i /= 10;
        }
        return i;
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

3分钟秒懂大数据

你的打赏就是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值