Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Math.floor проблема с округлением (https://javascript.ru/forum/css-html/10936-math-floor-problema-s-okrugleniem.html)

exvion 29.07.2010 19:29

Math.floor проблема с округлением
 
Задача состоит в округлении числа до одного знака после запятой.
Для примера взял число 4.648. В результате надеюсь получить 4.6.
Запускаю следующий код:
var test=Math.floor(4.648/0.1)*0.1;
console.warn('test=%f',test);


В консоли:
test=4.6000000000000005

В чём ошибка?

exec 29.07.2010 19:47

(4.648).toFixed(1);

subzey 29.07.2010 19:48

Накапливается погрешность в float.
Используйте лучше toFixed
(4.648).toFixed(1)

exvion 29.07.2010 19:55

Спасибо, это работает. Только одна загвоздка. У меня есть переменная step. Если она равна 0.1, то необходимо округлять до одного знака после запятой, если 0.01, то до 2-х, и так далее. Если равна 1, то округлять до целого числа. Возможно ли каким-нибудь образом дополнить этот код с учетом переменной step?

exec 29.07.2010 20:38

Наверно так:

var foo = 4.6000000000000005; alert( foo.toFixed((foo + '').split('.')[1].indexOf('0') ) );

x-yuri 29.07.2010 21:05

Цитата:

Сообщение от exvion
Возможно ли каким-нибудь образом дополнить этот код с учетом переменной step?

для этого тебе надо больше рассказать о том, что ты делаешь. А проблема в том, как храняться числа в компьютере, подробнее здесь

exec, а если 4.06000000000000000005?

exec 29.07.2010 21:09

Цитата:

exec, а если 4.06000000000000000005?
Именно поэтому я написал

Цитата:

Наверно так:
Нужно было вырезать все цифры, идущие за нулями, которых стоит больше десяти подряд. Ну и сами нули, ессно.

exvion 29.07.2010 21:51

Попробую пояснить.
То что было.
var step=0.01; // 1, 0.1, 0.01, 0.001, 0.0001 
var number=4.648;
var result=Math.floor(number/step)*step;

Результат, который бы хотелось видеть.
step=1 result=4
step=0.1 result=4.6
step=0.01 result=4.65

Пробую переписать с использованием toFixed.
var step=0.01; // 1, 0.1, 0.01, 0.001, 0.0001
var number=4.648;
count=func(step);
result=number.toFixed(count);

Какой должна быть функция func?

exec 29.07.2010 22:00

function splitNull( num ) {
	return  parseFloat( (num + '').replace( /0{10,}\d+/, '' ) );
}

alert(splitNull(46.0100000000001)); // 46.01

x-yuri 29.07.2010 22:20

exvion, ты рассказал то же самое только другими словами. Что это за number, step и что вообще там у тебя происходит?

exec, все еще fail
var step=0.01; // 1, 0.1, 0.01, 0.001, 0.0001
var number=4.648;
alert(splitNull(number));

function splitNull( num ) { 
    return  parseFloat( (num + '').replace( /0{10,}\d+/, '' ) ); 
}


Часовой пояс GMT +3, время: 17:49.