Javascript round / floor / toFixed on decimals - PullRequest
0 голосов
/ 23 июня 2018

У меня проблема с тем, как javascript делит и округляет число.

У меня есть два числа с плавающей запятой, 0,11 и 0,12

Я хочу вычислить середину этих двух чисел и округлить ее до ближайшего наибольшего значения с двумя десятичными ценами.

ДляНапример, если я делаю это на калькуляторе

0,11 + 0,12 / 2 = 0,115, и мне нужно округлить его до 0,12, так как он находится в середине или выше середины.

Если я сделаю это с Javascript, я не получу точное число

Пример,

var high = parseFloat(0.12);
var low = parseFloat(0.11);

var mid = (high + low) / 2;

document.getElementById("demo1").innerHTML = mid;
document.getElementById("demo2").innerHTML = mid.toFixed(2);

var another = mid.toFixed(3);
document.getElementById("demo3").innerHTML =another;

var last = Math.floor(another)
document.getElementById("demo4").innerHTML =last;

http://jsfiddle.net/gzqwbp6c/9/

Любой ввод будетоценили.

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

Нужно умножить (тренировка по части int, то есть найти середину и делить для повторного преобразования в начало координат):

function myMid(high,low, precision){
 var precision=2
 var convFactor = Math.pow(10,precision);
 return 
    (Math.round((low*convFactor+high*convFactor)/2)/convFactor).toFixed(precision);
}

Float не является точным, вы не можете полагаться на это, вы получите неожиданные результаты.

0 голосов
/ 23 июня 2018

все *100 для предотвращения неточностей

.toFixed() делает округление

var a = 0.11;
var b = 0.12;
c = parseFloat((((a*100) + (b*100))/200).toFixed(2));
console.log(c);
0 голосов
/ 23 июня 2018

Как показывает 0.11499999999999999, результат очень немного меньше, чем 0.115. Это потому, что 0.11 и 0.12 не могут быть представлены с идеальной точностью, используя числа с плавающей запятой.

Когда вы не хотите иметь дело с ошибкой с плавающей запятой, часто проще работать с целыми числами напрямую. Маленькие целые числа представлены точно числами с плавающей запятой.

Вы можете умножить на 100 до и округлить, чтобы убедиться, что ваши числа целые, и делите их только после получения окончательного результата:

var a = Math.round(100 * parseFloat("0.12"))        // 12
var b = Math.round(100 * parseFloat("0.11"))        // 11

var mid = (a + b) / 2                               // 11.5.
// 0.5 can be represented exactly in floating point for small numbers.

var midRound = (Math.round(mid) / 100).toFixed(2)   // "0.12"
...