You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					49 lines
				
				804 B
			
		
		
			
		
	
	
					49 lines
				
				804 B
			| 
								 
											4 years ago
										 
									 | 
							
								'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
							 | 
						||
| 
								 | 
							
								
							 |