原文:166. 分数到小数(leetcode 解题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-0166/

题目:

难度:Middle

相关话题:哈希表数学

给定两个整数,分别表示分数的分子numerator 和分母 denominator,以字符串形式返回小数。

如果小数部分为循环小数,则将循环的部分括在括号内。

示例 1:

输入: numerator = 1, denominator = 2
输出: "0.5"

示例2:

输入: numerator = 2, denominator = 1
输出: "2"

示例3:

输入: numerator = 2, denominator = 3
输出:"0.(6)"
/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {number} numerator
 * @param {number} denominator
 * @return {string}
 */
var fractionToDecimal = function(numerator, denominator) {
  if(numerator===0)return "0"
  let neg=0,res=''
  // 确定正负号
  if(numerator<0){neg=neg^1; numerator=-numerator}
  if(denominator<0){neg=neg^1; denominator=-denominator}
  if(neg===1)res='-'+res

  // 确定整数部分
  let int=Math.floor(numerator/denominator)
  let mod=numerator%denominator
  res+=int
  if(mod===0)return res
  res+="."

  // 确定小数部分
  let modHash={}
  modHash[mod]=res.length
  while(mod!==0){
    mod*=10
    res+=Math.floor(mod/denominator)
    mod %= denominator
    if(modHash[mod]!=null){
      let idx=modHash[mod]
      res=res.substring(0,idx)+"("+res.substring(idx)+")"
      break
    }
    modHash[mod]=res.length
  }
  return res


};