Вопрос

У меня есть функция для округления числа, заданного функции, до ближайшего целого пенса.

<script type='text/javascript'>
Math.roundNumber = function(a,b){
    if(!isNaN(parseInt(a))){
        c = Math.pow(10,b);
        return (Math.round(a*c)/c);
    }
    return false;
}
</script>

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

Например,G.

15.236562213541684 would = 15.24  
9846.65456169846 would = 9846.66

Я думал, что это будет просто случай изменения return (Math.round(ac)/c);Для возврат (Math.ceil(ac)/c);

Очевидно, я был очень неправ.

Любая помощь по этому вопросу?

** РЕДАКТИРОВАТЬ **

Вот формула, которой я пытаюсь достичь, возможно, это поможет

a = intrest price
b = terms
c = a/b
d = c*(b-1)
e = a-d

так, например

a = 295.30
b = 156
c = 295.30/156 = 1.90 (rounded up to nearest decimal as above)
d = 1.90 * (b-1) = 294.50
e = 295.30 - 294.50 = 0.80

кто-нибудь может настроить функцию для выполнения вышеописанного?

Здесь это ссылка на текущий код, который у меня есть, включая формулу...это очень старая формула, которую я создал, когда впервые запустил JavaScript (а это было уже довольно давно), однако сейчас я все еще не лучше, чем был тогда.

Кто-нибудь может очистить его, чтобы посмотреть, могут ли они понять, почему он не работает в соответствии с описанной выше функцией?

Это было полезно?

Решение

function currency_fix(number)
{
    var unfixed_number = Math.ceil(number.toFixed(5) * 100) / 100;
    return unfixed_number.toFixed(2)
}

var a = currency_fix(295.30)
var b = currency_fix(156)
var c = currency_fix(a / b)
var d = currency_fix(c * (b - 1))
var e = currency_fix(a - d)

document.write(
    'a = ' + a + '<br />' +
    'b = ' + b + '<br />' +
    'c = ' + c + '<br />' +
    'd = ' + d + '<br />' +
    'e = ' + e + '<br />'
)

// OUTPUT
//a = 295.30
//b = 156.00
//c = 1.90
//d = 294.50
//e = 0.80

Я получил это, чтобы дать желаемые результаты в данном случае.Не уверен, будет ли это работать каждый раз, но, похоже, работает.Сначала я бы обязательно проверил, работает ли это так, как вы хотите.

Другие советы

Для этого уже есть встроенная функция, Number.toFixed(numDigits), почему бы не использовать это?

Параметр:цифры
Количество цифр, которые должны быть указаны после десятичной запятой;это может быть значение от 0 до 20 включительно, и реализации могут необязательно поддерживать больший диапазон значений.Если этот аргумент опущен, он обрабатывается как 0.

ВОЗВРАТ:
Строковое представление числа, которое не использует экспоненциальную нотацию и содержит ровно цифры после десятичного знака.При необходимости число округляется, а дробная часть при необходимости дополняется нулями, чтобы оно имело указанную длину.Если число больше 1e + 21, этот метод просто вызывает Number.toString() и возвращает строку в экспоненциальной записи.

Пример:

>>> new Number(15.236562213541684).toFixed(2);
"15.24"
>>> new Number(9846.65456169846).toFixed(2);
"9846.65"

Этот последний не соответствует вашему примеру - 9846.65456169846 округленный до двух знаков после запятой , должен быть 9846.65, не 9846.66.

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

1) Затем вы должны просто умножить свое исходное число на 100

2) если (число(x.charAt(indexOf(".") + 1)) > 4) { x += 1} где x - ваш номер

3) Синтаксический анализ

4) разделите на 100, и все готово.

Совет использовать арифметику с фиксированной запятой - хороший совет.К сожалению, в Javascript нет арифметики с фиксированной запятой - все числа являются числами с плавающей запятой двойной точности.(Ну, никакой арифметики с фиксированной запятой без использования какой-либо явной библиотеки поддержки.)

Для очистки ввода в текстовых полях я начал работать с числами в виде строк (насколько это возможно).Разделите входные данные на части слева и справа от десятичной точки, затем обработайте целочисленные значения (при необходимости с помощью Math.floor()).Если вам приходится иметь дело с случайными цифрами после 2-го знака после запятой, либо относитесь к ним как к ошибке (что они вообще означают?), либо, опять же, разделите их и работайте с ними как с целыми числами.

Если вы не имея дело с пользовательскими значениями (т. Е. данными из полей текстового ввода), вам действительно не следует делать это в Javascript, потому что, опять же, у вас нет числовых инструментов, которые вам действительно нужны.

Замена Math.round() с Math.ceil() должно сработать:Ошибка, должно быть, где-то в другом месте.

Кроме того, я предлагаю отказаться от isNaN(parseInt()) полностью, поскольку математические функции в любом случае приведут к number, возвращая NaN если это невозможно.Это приведет к возвращению функции NaN кроме того, что лучше подходит, чем логическое false.

И кстати:это плохая идея использовать математику с плавающей запятой с денежными значениями:вместо этого используйте арифметику с фиксированной запятой!


Теперь, когда мы знаем, что вы пытаетесь сделать, вот код, который вычисляет желаемые значения для вашего примера:

var value = 295.30;
var count = 156;
var payment = Math.ceil(value * 100 / count) / 100;
var last_payment = Math.round((value - (count - 1) * payment) * 100) / 100;

Меняющийся round() Для ceil() поскольку все вычисления не сработали, так как последний платеж должен быть округлен обычным образом, чтобы компенсировать неточности из-за использования значений с плавающей запятой.

Как правило, лучше использовать только целочисленную математику, поэтому умножьте все значения на 100 и преобразуйте только при выводе значений:

var value = 29530;
var count = 156;
var payment = Math.ceil(value / count);
// rounding no longer necessary as integer math is precise:
var last_payment = value - (count - 1) * payment;

Нет, ты был прав.

Я протестировал ваш код с помощью модификации ceil, и это работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top