分数转小数

15 篇文章 0 订阅
11 篇文章 0 订阅

JavaScript: 

//a,b均为整数,b不为0
//返回字符串,代表分数的小数表示
function divide(a, b) {
	//能整除直接返回
	if(a % b === 0) return a / b;
	//不能整除分两种情况,结果是有限小数,结果是无限循环小数
	//sign,存储结果正负号
	let sign = "";
	if(a > 0 && b < 0 || a < 0 && b > 0) sign = "-";
	//如果a,b是负数,转为正数
	a = Math.abs(a);
	b = Math.abs(b);
	//整数部分round
	let round = Math.floor(a / b);
	//余数
	let rest = a % b;
	//decimal数组用于存储小数位
	let decimal = [];
	//map,建立余数与decimal数组下标之间的关系,以便寻找循环节
	let map = new Map();
	//res存储结果
	let res = sign + round + ".";

	//以下代码模拟小学学的除式计算除法步骤
	do {
		map.set(rest, decimal.length);
		rest *= 10;
		decimal.push(Math.floor(rest / b));
		rest %= b;
		if(rest === 0) {
			//说明结果是有限小数
			res += decimal.join("");
			break;
		}
		let loop = map.get(rest);
		if(loop !== undefined) {
			//说明结果是无限循环小数,且循环节从decimal数组下标为loop的位置开始
			for(let i = 0; i < loop; i++) {
				res += decimal[i];
			}
			res += "(";
			for(let i = loop; i < decimal.length; i++) {
				res += decimal[i];
			}
			res += ")";
			break;
		}
	} while (true);
	return res;
}

Python:

def divide(a, b):
    # 参数:整数分子a, 分母b;返回值(a/b)类型:字符串
    ret = ''  # python没有整除,//是向下取整,不同于C
    if (a > 0) and (b < 0) or (a < 0) and (b > 0): ret = '-'
    a = abs(a)  # 结果的符号已经确定,把a,b作正数处理
    b = abs(b)  # 因为python模运算不同于C
    ret += str(a // b)
    left = a % b
    if left == 0: return ret  # 可整除
    a = left  # 将分子化为小于分母
    i = 0
    s = {a: i, }  # 用字典存储余数,便于快速判断余数是否已存在
    res = ''  # res为结果的小数部分
    while True:
        a *= 10
        while a < b:
            res += '0'
            a *= 10
        res += str(a // b)
        left = a % b
        if left == 0: break
        if s.get(left, -1) >= 0:  # 余数重复出现,找到循环节
            st = s.get(left)  # 循环节起始位置
            res = res[:st] + '(' + res[st:] + ')'
            break
        i += 1
        s[left] = i  # 余数加入字典中
        a = left
    return ret + '.' + res

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值