Округление десятичных знаков или дробей до 16-го с помощью jquery

Я использую этот код для преобразования десятичных знаков в дробь:

Number.prototype.fraction=fraction;
        function fraction(decimal){
            if(!decimal){
                decimal=this;
            }
            whole = String(decimal).split('.')[0];
            decimal = parseFloat("."+String(decimal).split('.')[1]);
            num = "1";
            for(z=0; z<String(decimal).length-2; z++){
                num += "0";
            }
            decimal = parseInt(decimal*num);
            num = parseInt(num);
            for(z=2; z<decimal+1; z++){
                if(decimal%z==0 && num%z==0){
                    decimal = decimal/z;
                    num = num/z;
                    z=2;
                }
            }
            return ((whole==0)?"" : whole+" ")+decimal+"/"+num;
        }

Это работает, но есть некоторые проблемы, которые я не могу решить. Во-первых, числа с длинными (или бесконечными) цифрами после запятой убивают страницу, поэтому мне пришлось вручную ограничивать ввод с помощью .round() перед его использованием. Во-вторых, мне нужно иметь возможность округлить значение дроби до ближайшего 16-го.

Я понимаю, что это особенно сложная проблема, как я обнаружил, бродя по Google в течение двух дней, но, надеюсь, кто-то знает, как это сделать. Я открыт для любых решений.


person Eckstein    schedule 27.02.2016    source источник


Ответы (2)


Пытаться:

Math.round( number * 16) / 16

Например:

Math.round(32578.8252789345798345987683476983476908347569873490867309487609875690860*16)/16

дает

32578.8125

Что = 32578 + 13/16

person R. Schifini    schedule 27.02.2016
comment
Может быть, я неправильно истолковал ваш раунд с точностью до 16-го. Если да, то я удалю свой ответ. - person R. Schifini; 27.02.2016
comment
Ага! Я вижу, как это работает сейчас. Я думал, что мне нужно будет каким-то образом манипулировать дробными частями, но это очень просто. Спасибо! - person Eckstein; 27.02.2016
comment
Нет, это не так, это идеально. - person Eckstein; 27.02.2016

Мне нужно иметь возможность округлить значение дроби до ближайшего 16-го

Попробуйте создать массив, содержащий числа от 1/16 до 1 , используя Array.prototype.reduce() , for цикл, Math.min(), Math.round()

var s = 1/16, d = [];

for (var i = s, n = 0; i < 1; i += s, n++) {
  d[n] = i
}

function f16(num) {
  return num
    .split(".")
    .reduce(function(a, b, index, arr) {
      var curr = +("." + b), j;
      for (var i = 0; i < d.length; i++) {
        if (Math.min(curr, d[i]) === curr) {
          j = " " + (i + 1) + "/" + (d.length + 1);
          break;
        }
      };
      return j === 0 ? +a + Math.round(curr) : a + j;
    })
}

document.onchange = function(event) {
  document.querySelector("output").innerHTML = f16(event.target.value)
}
<input type="number" step="0.1" />
<output></output>

person guest271314    schedule 27.02.2016