给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: "0.5"
示例 2:
输入: numerator = 2, denominator = 1
输出: "2"
示例 3:
输入: numerator = 2, denominator = 3
输出: "0.(6)"
public String fractionToDecimals(int numerator, int denominator) {
if (numerator == 0) {
return "0";
}
if (denominator == 0) {
throw new IllegalArgumentException();
}
//逻辑异或解决结果为负的问题
StringBuilder stb = new StringBuilder();
if (numerator < 0 ^ denominator < 0) {
stb.append("-");
}
//取绝对值,去除符号位的干扰,可能会越界,用long类型计算
long dividend = Math.abs(Long.valueOf(numerator));
long divisor = Math.abs(Long.valueOf(denominator));
stb.append(dividend / divisor);
long remainer = dividend % divisor;
if (remainer == 0) {
return stb.toString();
}
stb.append(".");
Map<Long, Integer> map = new HashMap<>();
while (remainer > 0) {
if (map.containsKey(remainer)) {
stb.insert(map.get(remainer), "(");
stb.append(")");
break;
}
map.put(remainer, stb.length());
remainer *= 10;
stb.append(remainer / divisor);
remainer %= divisor;
}
return stb.toString();
}