| 'use strict' |
| |
| var abs = Math.abs |
| var round = Math.round |
| |
| function almostEq(a, b) { |
| return abs(a - b) <= 9.5367432e-7 |
| } |
| |
| //最大公约数 Greatest Common Divisor |
| function GCD(a, b) { |
| if (almostEq(b, 0)) return a |
| return GCD(b, a % b) |
| } |
| |
| function findPrecision(n) { |
| var e = 1 |
| |
| while (!almostEq(round(n * e) / e, n)) { |
| e *= 10 |
| } |
| |
| return e |
| } |
| |
| function num2fraction(num) { |
| if (num === 0 || num === '0') return '0' |
| |
| if (typeof num === 'string') { |
| num = parseFloat(num) |
| } |
| |
| |
| var precision = findPrecision(num) //精确度 |
| var number = num * precision |
| var gcd = abs(GCD(number, precision)) |
| |
| //分子 |
| var numerator = number / gcd |
| //分母 |
| var denominator = precision / gcd |
| |
| //分数 |
| return round(numerator) + '/' + round(denominator) |
| } |
| |
| module.exports = num2fraction |
| |