Проблема с округлением чисел

409
24 ноября 2016, 09:51

Всем привет. Делаю алгоритм биржи, который определяет нужную сумму и коэффициент 2 игрока исходя из суммы и коэффициента 1 игрока. Алгоритм есть и на JS и на PHP.

var mt = {
    //Определяет коэф. 2 игрока
    findOtherRatio: function(ratioOtherPlayer){
        return ratioOtherPlayer / (ratioOtherPlayer - 1)
    },
    //Определяет прибыль 1 игрока - что также является нужной, стартовой суммой 2 игрока
    findProfit: function(start, ratio){
        return  start * ratio - start;
    },
    //Сумма вывода игрока
    findOutcome: function(start, ratio){
        return  start * ratio;
    }
};

Все считает практически верно. Но проблема в том, что во многих случаях цифры выглядят тысячными, миллионными... И как только я хочу придать презентабельный вид цифрам, а именно - максимум 2 цифры после запятой, то цифры перестают быть равными(вывод 1 игрока != выводу 2 игрока).

Например: представим, что 1 игрок поставил 736 руб на 1.55

 var cof2Player = mt.findOtherRatio(1.55).toFixed(2)
 var money2Player = mt.findProfit(736,1.55).toFixed(2)
 mt.findOutcome(money2Player, cof2Player).toFixed(2) // 1141.54
 mt.findOutcome(736, 1.55).toFixed(2) // 1140.80

Можно ли это как-то обойти? Как это решают различные биржи? Ведь они не показывают игрокам коэффициенты "3.8571428571428563".

Answer 1

Вот что будет если использовать math.js:

var mt = {
    //Определяет коэф. 2 игрока
    findOtherRatio: function(ratioOtherPlayer){
        return ratioOtherPlayer.div(ratioOtherPlayer.sub(1));
    },
    //Определяет прибыль 1 игрока - что также является нужной, стартовой суммой 2 игрока
    findProfit: function(start, ratio){
        return start.mul(ratio).sub(start);
    },
    //Сумма вывода игрока
    findOutcome: function(start, ratio){
        return start.mul(ratio);
    }
};
var N = math.fraction;
var cof2Player = mt.findOtherRatio(N('1.55'));
var money2Player = mt.findProfit(N('736'), N('1.55'));
var t1 = mt.findOutcome(money2Player, cof2Player); // 1140.8
var t2 = mt.findOutcome(N('736'), N('1.55')); // 1140.8

Для вывода можно использовать format:

math.format(2.3, {notation: 'fixed', precision: 2});  // returns '2.30'
READ ALSO
Как сделать на javascript(e) при двойном клике появление окна для ввода чисел?

Как сделать на javascript(e) при двойном клике появление окна для ввода чисел?

Отбор товара в простейшем Интернет-магазине. Документ разделён на 2 фрейма.

512
iqGrid, модальные окна

iqGrid, модальные окна

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

394
Не работает отправка формы на jquery

Не работает отправка формы на jquery

Пытаюсь проверить поле "email" и отправить форму, если "email" не пусто и валидно. Но почему-то форма не отправляется.

385
Компактность div-ов в drag-and-drop jquery

Компактность div-ов в drag-and-drop jquery

Всем привет! Появилась необходимость в реализации drag-and-drop с автоматическим "компактным" складыванием блоков. Все блоки разного размера.

412