как добиться точности чисел 0,05?

Следующее гарантирует, что любые большие числа будут точными только до сотых долей (связанные с этим ответом):

public function round( sc:Number ):Number
{
    sc = sc * 100;
    sc = Math.floor( sc );
    sc = sc / 100;

    return sc;
}

Как лучше всего округлить мои числа до точности 0,05? Есть ли что-нибудь умное, что можно сделать со сдвигом битов, чтобы получить такой результат? Например, я бы хотел:

3.4566 = 3.45

3.04232 = 3.05

3.09 = 3.1

3.32 = 3.3


person jedierikb    schedule 28.04.2009    source источник


Ответы (2)


Вы можете умножить на 20, округлить, а затем разделить на 20.

Изменить: вы захотите использовать Math.round () вместо Math.floor (), иначе ваш тестовый пример 3.09 превратится в 3.05.

person Chris Thornhill    schedule 28.04.2009

Вы можете просто изменить * 100 на * 20 и / 100/20. Но зачем останавливаться на достигнутом, если можно естественным образом обобщать?

double floor(double in, double precision) {
    return Math.floor(in/precision)*precision
}
//floor(1.07, 0.05) = 1.05
person Craig Gidney    schedule 28.04.2009
comment
Это должен быть Math.round (), а не Math.floor (). - person Svante; 29.04.2009
comment
В его примере использовался пол, поэтому я использовал пол. Также обратите внимание, что я вызвал функцию floor, чтобы было понятно. - person Craig Gidney; 29.04.2009
comment
Чтобы получить согласованные результаты для отрицательных чисел, вы также должны добавить 0,5 к результату in / precision, переданному в Math.floor (). - person Alnitak; 29.04.2009
comment
Это сделало бы функцию округления, а не функцию пола. Этаж скругляется к отрицательной бесконечности. То, о чем вы думаете, называется усечением. - person Craig Gidney; 29.04.2009