X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Калькулятор на Javascript, Проблема представления десятичного знака
mark2013
mark2013
Topic Starter сообщение 20.9.2024, 23:56; Ответить: mark2013
Сообщение #1


Пишу калькулятор на JS и реализовал логику последовательных вычислений. Например 7+4+2 даёт 13. Ввёл десятичный знак:

Код
else if (buttonType === 'decimal') {
           // Detect the decimal separator based on the user's locale
            const numberFormat = new Intl.NumberFormat();
            const decimalSeparator = numberFormat.format(1.1).replace(/[^0-9.]/g, '');

            // Replace the decimal separator in the currentNumber with a period
            currentNumber = currentNumber.replace(decimalSeparator, '.');

            if (currentNumber === "") {
            currentNumber = "0.";
            } else {
            currentNumber += ".";
            }
            calcDisplay.textContent = currentNumber;
            decimalPressed = true;
        }


Естественно, что переменная decimalPressed изначально инициализирована с false.

По нажатию на любую цифру:

Код
calcContainer.addEventListener('click', (e) => {

    if (e.target.classList.contains('calc__button')) {

        let buttonType = e.target.dataset.type;


        if (buttonType === 'digit') {
            currentNumber += e.target.textContent;
            calcDisplay.textContent = currentNumber;

            // Detect the decimal separator based on the user's locale
            const numberFormat = new Intl.NumberFormat();
            const decimalSeparator = numberFormat.format(6.3).replace(/[^0-9.]/g, '');

            // Replace decimal separators with periods in both previousNumber and currentNumber

            if (previousNumber.includes(decimalSeparator)) {
                previousNumber = previousNumber.replace(decimalSeparator, '.');
            }
            
            if (currentNumber.includes(decimalSeparator)) {
                currentNumber = currentNumber.replace(decimalSeparator, '.');
            }


Всё работает. НО... именно из-за этого кода нарушается логика последовательных вычислений! Т.е. теперь 7+4+2 даёт не 13 а 6, т.е. в расчёт берутся только последние 2 числа. Я никак не могу понять, в чём дело.... убирал данный код — последовательные вычисления работают без проблем!


--------------------
Здесь я хостю свои проекты
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
malamut
malamut
сообщение 21.9.2024, 15:40; Ответить: malamut
Сообщение #2


У вас калькулятор с возможностью нажатия кнопок или с ручным вводом, правильно?
Если попробовать делать замену не после нажатия каждой кнопки, а уже непосредственно при нажатии "="? Или у вас результат "живой" - отображается при нажатии на любую клавишу?

В качестве оптимизации - decimalSeparator можно вынести в глобальную константу, чтобы не высчитывать её на каждый чих.


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
mark2013
mark2013
Topic Starter сообщение 21.9.2024, 16:22; Ответить: mark2013
Сообщение #3


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

Короче проблему последовательных вычислений решил, сейчас всё работает нормально. Но вот десятичный знак никак не хочет работать...
7.2+2.2 = 11.399999999999999999

Как так.....

Я понял, в чём дело...

Вот код:

Код
if (operandPressed) {

                
                switch (operation) {
                    case "+":
                            
                        if (tempResult < 1) {
                            tempResult = parseFloat(previousNumber) + parseFloat(currentNumber);
                        }
                        
                        else {
                            tempResult = parseFloat(tempResult) + parseFloat(currentNumber);
                        }
                        break;


Чё здесь происходит? Когда я ввожу само число — ничё... но когда я нажимаю на какой-то знак операции, загорается флаг operandPressed. И тогда к tempResult прибавляется то число, которое я ввел. Это нормально при условии что вводятся Integer. Но если вводятся floating point, то он сначала прибавляет целую часть числа (т.к. стоит флаг operandPressed), а затем он эту целую часть ещё раз прибавляет, что неверно. Проблема понятна, вот как её побороть...


--------------------
Здесь я хостю свои проекты
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
malamut
malamut
сообщение 23.9.2024, 2:03; Ответить: malamut
Сообщение #4


Это известный баг js, можете просто в консоли браузера ввести 0.1+0.2.
Насколько знаю, решается приведением всех операндов к целому числу путём умножения на 10^n, а результат обратно разделить на 10^n

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Услуги по созданию и доработке скриптов PHP, MySQL, JavaScript, jQuery
Разработка сайтов и сервисов под-ключ
0 alexey 1625 24.11.2023, 14:46
автор: alexey
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыВеб-разработка (HTML5, CSS3, JavaScript, jQuery, Ajax, PHP)
56 qpPeW 47533 19.7.2023, 10:03
автор: qpPeW
Открытая тема (нет новых ответов) Кальку, точнее калькулятор в строительной тематике
Нужен PHP код
1 MihalychAIP 1066 20.4.2022, 2:04
автор: sergogogo
Открытая тема (нет новых ответов) 1C-Bitrix, JavaScript\jQuery, Верстка HTML5 CSS3
1 byteeightlab 1665 2.7.2019, 7:37
автор: ychervov
Открытая тема (нет новых ответов) Ищется программист. Создать калькулятор цен на сайте
JS | DLE
0 Mukis 1825 1.4.2019, 15:24
автор: Mukis


 



RSS Текстовая версия Сейчас: 21.4.2025, 18:16
Дизайн