Math.floor проблема с округлением
Задача состоит в округлении числа до одного знака после запятой.
Для примера взял число 4.648. В результате надеюсь получить 4.6. Запускаю следующий код: var test=Math.floor(4.648/0.1)*0.1; console.warn('test=%f',test); В консоли: test=4.6000000000000005 В чём ошибка? |
(4.648).toFixed(1);
|
Накапливается погрешность в float.
Используйте лучше toFixed (4.648).toFixed(1) |
Спасибо, это работает. Только одна загвоздка. У меня есть переменная step. Если она равна 0.1, то необходимо округлять до одного знака после запятой, если 0.01, то до 2-х, и так далее. Если равна 1, то округлять до целого числа. Возможно ли каким-нибудь образом дополнить этот код с учетом переменной step?
|
Наверно так:
var foo = 4.6000000000000005; alert( foo.toFixed((foo + '').split('.')[1].indexOf('0') ) ); |
Цитата:
exec, а если 4.06000000000000000005? |
Цитата:
Цитата:
|
Попробую пояснить.
То что было. 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? |
function splitNull( num ) { return parseFloat( (num + '').replace( /0{10,}\d+/, '' ) ); } alert(splitNull(46.0100000000001)); // 46.01 |
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. |