Javascript round / floor / toFixed по десятичным знакам

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

У меня есть два float, var high = parseFloat ( 0.12 ); var low = parseFloat ( 0.11 ); var mid = ( высокий + низкий ) / 2 ; документ . getElementById ( "demo1" ). innerHTML = mid ; документ . getElementById ( "demo2" ). внутреннийHTML = середина . toFixed ( 2 ); var another = mid . toFixed ( 3 ); документ . getElementById ( "demo3" ). innerHTML = другое ; var last = Math . пол ( другой ) документ . getElementById ( "demo4" ). innerHTML = последний ; и 0.11499999999999999

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

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

0.11 + 0.12 / 2 = 0.115, и мне нужно округлить его до 0.12, так как оно находится в середине или выше середины.

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

Пример,

0.11

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

Любой вход был бы оценен.

javascript,floating-accuracy,

0

Ответов: 3


0

Как 0.12показывает, результат очень немного меньше 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"

0

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

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);
}

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


0

все, *100чтобы предотвратить неточности

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

var a = 0.11;
var b = 0.12;
c = parseFloat((((a*100) + (b*100))/200).toFixed(2));
console.log(c);

JavaScript, с плавающей точностью,
Похожие вопросы