29.07.2010, 19:29
|
Интересующийся
|
|
Регистрация: 25.01.2010
Сообщений: 27
|
|
Math.floor проблема с округлением
Задача состоит в округлении числа до одного знака после запятой.
Для примера взял число 4.648. В результате надеюсь получить 4.6.
Запускаю следующий код:
var test=Math.floor(4.648/0.1)*0.1;
console.warn('test=%f',test);
В консоли:
test=4.6000000000000005
В чём ошибка?
|
|
29.07.2010, 19:47
|
Профессор
|
|
Регистрация: 21.01.2010
Сообщений: 1,022
|
|
(4.648).toFixed(1);
|
|
29.07.2010, 19:48
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
Накапливается погрешность в float.
Используйте лучше toFixed
(4.648).toFixed(1)
Последний раз редактировалось subzey, 29.07.2010 в 19:49.
Причина: exec, опередил :)
|
|
29.07.2010, 19:55
|
Интересующийся
|
|
Регистрация: 25.01.2010
Сообщений: 27
|
|
Спасибо, это работает. Только одна загвоздка. У меня есть переменная step. Если она равна 0.1, то необходимо округлять до одного знака после запятой, если 0.01, то до 2-х, и так далее. Если равна 1, то округлять до целого числа. Возможно ли каким-нибудь образом дополнить этот код с учетом переменной step?
Последний раз редактировалось exvion, 29.07.2010 в 19:58.
|
|
29.07.2010, 20:38
|
Профессор
|
|
Регистрация: 21.01.2010
Сообщений: 1,022
|
|
Наверно так:
var foo = 4.6000000000000005; alert( foo.toFixed((foo + '').split('.')[1].indexOf('0') ) );
|
|
29.07.2010, 21:05
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от exvion
|
Возможно ли каким-нибудь образом дополнить этот код с учетом переменной step?
|
для этого тебе надо больше рассказать о том, что ты делаешь. А проблема в том, как храняться числа в компьютере, подробнее здесь
exec, а если 4.06000000000000000005?
|
|
29.07.2010, 21:09
|
Профессор
|
|
Регистрация: 21.01.2010
Сообщений: 1,022
|
|
Цитата:
|
exec, а если 4.06000000000000000005?
|
Именно поэтому я написал
Нужно было вырезать все цифры, идущие за нулями, которых стоит больше десяти подряд. Ну и сами нули, ессно.
|
|
29.07.2010, 21:51
|
Интересующийся
|
|
Регистрация: 25.01.2010
Сообщений: 27
|
|
Попробую пояснить.
То что было.
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?
|
|
29.07.2010, 22:00
|
Профессор
|
|
Регистрация: 21.01.2010
Сообщений: 1,022
|
|
function splitNull( num ) {
return parseFloat( (num + '').replace( /0{10,}\d+/, '' ) );
}
alert(splitNull(46.0100000000001)); // 46.01
|
|
29.07.2010, 22:20
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
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+/, '' ) );
}
|
|
|
|