2016-03-22 1 views
2

У меня есть этот номер: -0,0166667, и я хотел бы получить только две плавающие цифры, так что число должно быть -0,01Получение 2 цифры с плавающей номер не работает, как ожидалось

Я попробовал этот

-0.0166667.toFixed(2) # gives : -0.02 

, а также это

Math.round(-0.0166667 * 100)/100 # also gives : -0.02 

Но оба преобразовать число в -0.02 вместо -0.01

Что здесь не так?

+0

Таким образом, вы не хотите, округление, но усечение? –

+0

Не удается заставить jsPerf работать прямо сейчас, но я не понимаю, почему substring() не работает здесь, если вы просто усекаете – colonelsanders

ответ

3

Используйте | поразрядным или для укорочения части.

var x = (-0.0166667 * 100 | 0)/100, 
 
    y = (0.0166667 * 100 | 0)/100; 
 
document.write(x + '<br>' + y);

Лучшее решение, которое сохраняет знак, относится пол и ставит знак обратно.

function toFixed(x, digits) { 
 
    return (x < 0 ? - 1 : 1) * Math.floor(Math.abs(x) * Math.pow(10, digits))/Math.pow(10, digits); 
 
} 
 

 
document.write(toFixed(-0.0166667, 2) + '<br>'); 
 
document.write(toFixed(0.0166667, 2) + '<br>'); 
 

 
document.write(toFixed(-0.0166667, 3) + '<br>'); 
 
document.write(toFixed(0.0166667, 3) + '<br>');

+1

Побитовая операция будет работать, но она потенциально теряет информацию. – Pointy

+0

Может ли это использоваться для 3 цифр точности? (любопытно) – phenxd

+0

Если Math.sign был поддержан в ie и сафари, второй был бы еще короче. –

1

Для чисел между меньше нуля, Math.ceil обрезает без округления и для чисел больше нуля Math.floor работает отлично. Как ваш номер меньше зер поэтому используйте Math.ceil вместо

Math.ceil(-0.0166667 * 100)/100

EDIT

Написать метод пользовательского помощника укоротить с плавающей точкой

function truncate(num) { 
    return num > 0 ? Math.floor(num) : Math.ceil(num); 
} 

и округлить число от -2 цифры

truncate(num * 100)/100

+0

Это сделает положительные числа округлыми вверх. Усечение «округляется до нуля». –

1

Math.round будет округлять число до ближайшего целого числа, поэтому вывод вашего кода на самом деле правильный. То, что вам нужно, - это усечение вместо округления. Вот самый простой способ сделать это:

function toZero(x) { 
 
    return x > 0 ? Math.floor(x) : Math.ceil(x); 
 
} 
 

 
function round2digits(x) { 
 
    return toZero(x * 100)/100; 
 
} 
 

 
document.write(round2digits(-0.0166)); // prints `-0.01`

Смежные вопросы