142、分数到小数

题目描述:

这个代码调bug调到我…
只有一处有问题:
在这里插入图片描述
其余应该都没问题

public static String fractionToDecimal(int numerator, int denominator) {
		long zhengshu = Math.abs((long)((long)numerator / denominator));
		long yushu = numerator % denominator;
		StringBuilder sb = new StringBuilder();
//		记录所有出现的余数,用以跳出循环
		List<Long> list = new ArrayList<>();
		
//		记录所有的商用以append
		List<Long> temlist = new ArrayList<>();
		
//		记录循环位置的下标
		int index = 0;
//		记录是否出现循环
		boolean iscycle = false;
		int []getchange = new int[2];
		int time = 0;
		if(yushu != 0){
			getchange = biandedayu(Math.abs(yushu), denominator);
			yushu = getchange[0];
			time = getchange[1];
		}
		for (int i = 0; i < time; i++) {
			temlist.add((long) 0);
		}
		while (yushu != 0) {
			if(list.contains(Math.abs(yushu))){
				iscycle = true;
				index = list.indexOf(Math.abs(yushu));
				break;
			}
			list.add(Math.abs(yushu));
			temlist.add(Math.abs(yushu * 10 / denominator));
			sb.append(Math.abs(yushu * 10/ denominator));
			yushu *= 10;
			yushu %= denominator;
		}
		System.out.println(temlist);
		if(!iscycle){
			if(sb.length() != 0){
				sb = addzero(time, sb);
				if((numerator <= 0 && denominator <= 0) || 
						((numerator >= 0) && (denominator >= 0))){
					
					return zhengshu + "." + sb;
				}else {
					return "-" + zhengshu + "." + sb;
				}
			}else {
//				sb = addzero(time, sb);
				if((numerator <= 0 && denominator <= 0) || 
						((numerator >= 0) && (denominator >= 0))){
					return zhengshu + "";
				}else {
					return "-" + zhengshu;
				}
			}
		}else {
			sb = new StringBuilder();
//			sb = addzero(time, sb);
			for (int i = 0; i < index; i ++) {
				long integer = temlist.get(i);
				sb.append(integer);
			}
			sb.append("(");
			for (int i = index; i < temlist.size(); i ++) {
				long integer = temlist.get(i);
				sb.append(integer);
			}
			sb.append(")");
			if((numerator <= 0 && denominator <= 0) || 
					((numerator >= 0) && (denominator >= 0))){
				return zhengshu + "." + sb;
			}else {
				return "-" + zhengshu + "." + sb;
			}
		}
    }
	public static int[] biandedayu(long i,long j){
		int index = 0;
		j = Math.abs(j);
		while (i < j) {
			i *= 10;
			index ++;
		}
		System.out.println("得到最小的单位  "+ i / 10);
		return new int[]{(int) (i / 10),index - 1};
	}

	
	public static StringBuilder addzero(int num,StringBuilder sb){
		for (int i = 0; i < num; i++) {
			sb = new StringBuilder("0").append(sb);
		}
		return sb;
	}
	

看看官方给的,再看看我写的。。。

//	别人实现的
	public String fractionToDecimal2(int numerator, int denominator) {
	    if (numerator == 0) {
	        return "0";
	    }
	    StringBuilder fraction = new StringBuilder();
	    // If either one is negative (not both)
	    if (numerator < 0 ^ denominator < 0) {
	        fraction.append("-");
	    }
	    // Convert to Long or else abs(-2147483648) overflows
//	    全部转成正数
	    long dividend = Math.abs(Long.valueOf(numerator));
	    long divisor = Math.abs(Long.valueOf(denominator));
//	    把整数部分放入
	    fraction.append(String.valueOf(dividend / divisor));
	    long remainder = dividend % divisor;
//	    如果余数等于零,直接返回
	    if (remainder == 0) {
	        return fraction.toString();
	    }
	    fraction.append(".");
	    Map<Long, Integer> map = new HashMap<>();
	    while (remainder != 0) {
	        if (map.containsKey(remainder)) {
	            fraction.insert(map.get(remainder), "(");
	            fraction.append(")");
	            break;
	        }
	        map.put(remainder, fraction.length());
	        remainder *= 10;
	        fraction.append(String.valueOf(remainder / divisor));
	        remainder %= divisor;
	    }
	    return fraction.toString();
	}

猜你喜欢

转载自blog.csdn.net/qq_34446716/article/details/94155832