Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.07.2010, 19:29
Интересующийся
Отправить личное сообщение для exvion Посмотреть профиль Найти все сообщения от exvion
 
Регистрация: 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

В чём ошибка?
Ответить с цитированием
  #2 (permalink)  
Старый 29.07.2010, 19:47
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

(4.648).toFixed(1);
Ответить с цитированием
  #3 (permalink)  
Старый 29.07.2010, 19:48
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

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

Последний раз редактировалось subzey, 29.07.2010 в 19:49. Причина: exec, опередил :)
Ответить с цитированием
  #4 (permalink)  
Старый 29.07.2010, 19:55
Интересующийся
Отправить личное сообщение для exvion Посмотреть профиль Найти все сообщения от exvion
 
Регистрация: 25.01.2010
Сообщений: 27

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

Последний раз редактировалось exvion, 29.07.2010 в 19:58.
Ответить с цитированием
  #5 (permalink)  
Старый 29.07.2010, 20:38
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Наверно так:

var foo = 4.6000000000000005; alert( foo.toFixed((foo + '').split('.')[1].indexOf('0') ) );
Ответить с цитированием
  #6 (permalink)  
Старый 29.07.2010, 21:05
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от exvion
Возможно ли каким-нибудь образом дополнить этот код с учетом переменной step?
для этого тебе надо больше рассказать о том, что ты делаешь. А проблема в том, как храняться числа в компьютере, подробнее здесь

exec, а если 4.06000000000000000005?
Ответить с цитированием
  #7 (permalink)  
Старый 29.07.2010, 21:09
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

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

Цитата:
Наверно так:
Нужно было вырезать все цифры, идущие за нулями, которых стоит больше десяти подряд. Ну и сами нули, ессно.
Ответить с цитированием
  #8 (permalink)  
Старый 29.07.2010, 21:51
Интересующийся
Отправить личное сообщение для exvion Посмотреть профиль Найти все сообщения от exvion
 
Регистрация: 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?
Ответить с цитированием
  #9 (permalink)  
Старый 29.07.2010, 22:00
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

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

alert(splitNull(46.0100000000001)); // 46.01
Ответить с цитированием
  #10 (permalink)  
Старый 29.07.2010, 22:20
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 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+/, '' ) ); 
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск