Javascript номер деления - PullRequest
0 голосов
/ 03 мая 2019

У меня есть несколько дел, которые мне нужно охватить при делении чисел.

Правила: - Отдел должен всегда возвращать 2 десятичных знака - Там не должно быть округления.

Я использую логику:

function divideAndReturn (totalPrice, runningTime) {
  let result;
  let totalPriceFloat = parseFloat(totalPrice).toFixed(2);
  let runningTimeNumber = parseInt(runningTime, 10); // Always a round number
  result = totalPriceFloat / runningTimeNumber; // I do not need rounding. Need exact decimals

  return result.toString().match(/^-?\d+(?:\.\d{0,2})?/)[0]; // Preserve only two decimals, avoiding rounding up.
}

Работает, как и ожидалось, для следующего случая:

let totalPrice = '1000.00';
let runningTime = '6';
// result is 166.66

Это также работает для этого случая:

let totalPrice = '100.00';
let runningTime = '12';
// Returns 8.33

Но для этого случая он не работает должным образом:

let totalPrice = '1000.00';
let runningTime = '5';
// Returns 200. Expected is 200.00

Кажется, когда я делю круглые числа, само деление удаляет .00 десятичных знаков

Если есть исправление моей логики, пожалуйста, пролите немного света. Или, если есть лучший способ покрыть это, я тоже счастлив.

PS. Числа поступают из базы данных и всегда изначально являются строками.

Ответы [ 4 ]

3 голосов
/ 03 мая 2019

Рекомендуется сначала умножить число на 100 (если вам требуется 3 цифры после десятичной, затем 1000 и т. Д.). Преобразуйте результат в целое число, а затем разделите на 100.

function divideAndReturn (totalPrice, runningTime) {
    let result;
    let totalPriceFloat = parseFloat(totalPrice); // no need to format anything right now
    let runningTimeNumber = parseInt(runningTime, 10); // Always a round number
    result = parseInt((totalPriceFloat * 100) / runningTimeNumber); // I do not need rounding. Need exact decimals
    result /= 100
    return result.toFixed(2) // returns a string with 2 digits after comma
}

console.log(divideAndReturn('1000.00', 6))
console.log(divideAndReturn('100.00', 12))
console.log(divideAndReturn('1000.00', 5))
1 голос
/ 03 мая 2019

Используйте toFixed в результате, чтобы преобразовать число в строку в требуемом формате. Преобразование целого числа в строку никогда не будет отображаться и цифры после десятичного знака.

function divideAndReturn (totalPrice, runningTime) {
  let totalPriceFloat = parseFloat(totalPrice);
  let runningTimeNumber = parseInt(runningTime, 10);
  let result = totalPriceFloat / runningTimeNumber;
  
  // without rounding result
  let ret = result.toFixed(3)
  return ret.substr(0, ret.length-1);
}

console.log(divideAndReturn('1000.00', '6'))
console.log(divideAndReturn('100.00', '12'))
console.log(divideAndReturn('1000.00', '5'))

Чтобы удалить любое «округление», используйте toFixed(3) и отбросьте последнюю цифру.

1 голос
/ 03 мая 2019

Вы можете попробовать добавить toFixed(2) в строку результатов:

result = (totalPriceFloat / runningTimeNumber).toFixed(2);
0 голосов
/ 03 мая 2019

Если я правильно понимаю, ваша цель - вернуть хорошо отформатированную строку в качестве результата деления, независимо от того, является ли результат округленным числом или нет.

Почему бы вам не проанализировать 2 входа как числа, выполнить деление, а затем отформатировать вывод, чтобы он соответствовал нужным вам значениям?

function divideAndReturn (totalPrice, runningTime) {
    let result;
    let totalPriceFloat = parseFloat(totalPrice); // no need to format anything right now
    let runningTimeNumber = parseInt(runningTime, 10); // Always a round number
    result = totalPriceFloat / runningTimeNumber; // I do not need rounding. Need exact decimals

    return result.toFixed(2) // returns a string with 2 digits after comma
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...