不用任何math方法,实现四舍五入(新浪微博面试题)

上周五去新浪微博面试了,上机做了一道笔试题,结果在规定的时间内没有完成,面试也没有成功,比较郁闷。没做出来这个题主要还是自己能力问题,附加对苹果机器的使用不习惯吧,不说这个了,还是书归正题,把这个问题解决了,以缓解自己的心情。

这个题的要求(可能记得不太全):

1. 不能使用任何math的任何方法;

2. round(value, pointNum)求出输入字符串value的精度为pointNum的四舍五入的值。如round("12345.6789", 3)得出12345.679

3. 字符串value可能不是数字,需要作出判断;

4. 字符串可能很长,超出整型范围。

差不多就这些;

我的代码是这样的: 

import java.util.ArrayList;

import java.util.List;

public class MyMath {

//是否需要进位  ---小数部分 向 整数部分进位

private static boolean isNeedCarry = false;

public static String round(String val , int pointNum){

isNeedCarry = false;

//切分 整数部分 和 小数部分

String[] valParts = val.split("\\.");

if(valParts.length<2){

return val;

}

String intPart = valParts[0];

String decimalPart = valParts[1];

//处理小数部分

if(pointNum>=decimalPart.length()){

return val;

}

decimalPart = decimalPart.substring(0,pointNum+1);

//利用hashMap存储分段后的partLast 

int partLen = 9;

List decimalPartList = getSplitNumberList(decimalPart,partLen);

StringBuilder sb = new StringBuilder();

//传入小数部分 和 是否为整数部分false

String calculateDecimal=calculate(decimalPartList,false);

sb.insert(0,calculateDecimal);

sb.insert(0, ".");

if(isNeedCarry){

List partFirstList = getSplitNumberList(intPart,partLen);

sb.insert(0,calculate(partFirstList,true));

}else{

sb.insert(0, intPart);

}

String retrunStr = sb.substring(0, sb.toString().length()-1).replaceAll("(0)*$", "").replaceAll("\\.$", "");

return retrunStr;

}

private static String calculate(List operateList, boolean isIntPosition) {

boolean isCarryBit = isNeedCarry;

StringBuilder sb = new StringBuilder();

for (int j = operateList.size() - 1; j >= 0; j--) {

String item = operateList.get(j);

try {

int temp = Integer.parseInt(item);

//精确度计算 末位+5..将精确度的后一位+5, 完成四舍五入操作。

if(!isIntPosition && j==operateList.size() - 1){

temp = temp + 5;

}

if (isCarryBit) {

temp = temp + 1;

}

sb.insert(0, temp);

if (String.valueOf(temp).length() > item.length()) {

// 如果不是 ( 整数部分 并且是 整数的最高位)则需要去除进位;

if (!(isIntPosition && j == 0)) {

sb.delete(0, 1);

}

isCarryBit = true;

} else {

isCarryBit = false;

}

} catch (NumberFormatException nfe) {

System.out.println("val 参数输入不是数字");

break;

}

}

isNeedCarry = isCarryBit;

return sb.toString();

}

public static List getSplitNumberList(String valStr, int partLen) {

List list = new ArrayList();

int itemLen = 0;

int listSize = valStr.length() / partLen + 1;

for (int i = 0; i < listSize; i++) {

itemLen = partLen * (i + 1) < valStr.length() ? partLen * (i + 1)

: valStr.length();

String item = valStr.substring(partLen * i, itemLen);

list.add(item);

}

return list;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println(round("12345.6789", 3));

System.out.println(round("12345.6789", 1));

System.out.println(round("5.6", 3));

System.out.println(round("0.9999", 3));

System.out.println(round("9.9099", 3));

System.out.println(round("99.9099", 3));

System.out.println(round("99.9999", 3));

System.out.println(round("-99.9999", 3));

System.out.println(round("-99.9099", 3));

System.out

.println(round(

"999999999999999999999999999999999999999999.99999923232399999999999999999",

3));

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值