округление в базе 10 - PullRequest
       17

округление в базе 10

1 голос
/ 01 октября 2009

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

<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>

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

Е.Г.

15.236562213541684 would = 15.24  
9846.65456169846 would = 9846.66

Я думал, что это просто случай изменения возврат (Math.round (a c) / c); к return (Math.ceil (a c) / 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 (что недавно было сейчас), однако я все еще не лучше сейчас, так как я был тогда.

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

Ответы [ 6 ]

5 голосов
/ 01 октября 2009

Для этого уже есть встроенная функция, 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 голос
/ 01 октября 2009

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

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

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

1 голос
/ 01 октября 2009

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

Кроме того, я предлагаю полностью сбросить isNaN(parseInt()), поскольку математические функции все равно приведут к числу, возвращая 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;
1 голос
/ 01 октября 2009

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

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

2) if (Number (x.charAt (indexOF (".") + 1))> 4) {x + = 1} где x - ваш номер

3) parseInt

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

0 голосов
/ 01 октября 2009
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

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

0 голосов
/ 01 октября 2009

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

Я протестировал ваш код с модификацией ceil, и он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...