Дивний javascript

Пишу ось один гаджет під вінду, юзаю javascript і працюю з датами. Потрібно було визначити який тиждень навчання. Звичайно, що при діленні треба округлювати числа, а то вилізають дроби, для цього вирішив заюзати функцію toFixed(). Як виявилося, вона повертає стрінговий рядок (О_о) і якщо далі додати до числа 1, то вийде, що воно вкінці просто її приліпить, тобто при такому коді:

tw = (4/3).toFixed();
week =tw+1;

week дорівнюватиме 11, а не бажаних 2. Але(!!!), якщо не додавати, а ділити, то воно юзатиме його, як число, тобто при:

tw = (4/3).toFixed()/1;
week =tw+1;

week дорівнюватиме два.

Можливо я чогось не розумію, але це дико…

Share
  • Слід явно давати JS знати про те, що змінна є числом – використовуючи, наприклад, parseInt(). JS НЕ є мовою з чіткою типізацією даних – хоча так, здогадливість залишає бажати ліпшого.

  • знаю, що не є мовою із суворою типізацією, але саме цей випадок є дивний для мене)

    та й взагалі для мене дивно, що округлення повертає стрінг

  • Імхо це логічно – toFixed призначений виключно для форматування (а не математичного округлювання), тому й повертає стрінги. Помилка в тому, що форматування проводиться не в кінці обчислень, а перед ними. Тобто треба, наприклад, div.innerHTML = week.toFixed(5);

  • А математичне округлювання в JS всі роблять так:
    var k = Math.pow(10, numDigits);
    num = Math.round(num * k)/k;

  • ну в JS я не сильний) буду знати за таке округлення, дякую)

    а на рахунок того в кінці чи ні, то, впринципі, в деяких обрахунках потрібно округлити не в кінці.

  • + це не лише додавання але й конкатенація (об’єднання рядків), тому перед такою операцією над числами треба обов’язково змінити їх тим на число.

  • все ж таки я чогось не розумів)

    дякую за підказки)