Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
12 / 12 / 1
Регистрация: 16.07.2012
Сообщений: 777

Скрипт не всегда правильно считает сложение десятичных дробей

17.05.2020, 21:54. Показов 4225. Ответов 7

Студворк — интернет-сервис помощи студентам
Добрый день.

Есть файл test.php, в котором в случайном порядке генерируются два числа (с 1-2 знаками после запятой)

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
<script src="/test.js"></script>
    
            <!--пример--><div class="primer">
            <?
            $numbers = array(10, 100);
            $chislo1 = rand(100, 999)/$numbers[array_rand($numbers)];
            $chislo2 = rand(100, 999)/$numbers[array_rand($numbers)];
            ?>
            <span id="chislo1" class="primer"><? echo $chislo1; ?></span> + <span id="chislo2" class="primer"><? echo $chislo2; ?></span> = <input class="primer" type="text" id="otvet" size="1" value="" />
            <input class="primer" id="disapotvet" type="button" value="Проверить" onclick="addition();disapotvet.style.display = 'none';">
            <input class="primer" type="button" value="Другой пример" onclick="window.location.reload();">
            <div id="resultat"></div>
            </div><!--end.пример-->
Потом эти два числа после вызова функции через кнопку ПРОВЕРИТЬ "забираются" скриптом из test.js

JavaScript
1
2
3
4
5
6
7
8
function addition() {
            var a = parseFloat(document.getElementById('chislo1').innerHTML.replace(',', '.'));
            var b = parseFloat(document.getElementById('chislo2').innerHTML.replace(',', '.'));
            var c = parseFloat(document.getElementById('otvet').value);
            if (c == (a+b)) {resultat.innerHTML = "<span class='vernyotvet'>Вы дали верный ответ.</span>"; Array.from(gifbox).forEach(loadImage);}
            if (isNaN(c)==true) {resultat.innerHTML = "<span class='nevernyotvet'>Вы не дали верный ответ!</span> " + "<br><span class='vernyotvet'>На самом деле  </span>" + a + " + " + b + "<span class='vernyotvet'> = " + (a+b)+"</span>";}
            if ((isNaN(c)!=true)&&(c != (a+b))){resultat.innerHTML = "<span class='nevernyotvet'>Вы не дали верный ответ!</span> " + a + " + " + b + "<span class='nevernyotvet'> ≠ " + c + "</span><br><span class='vernyotvet'>На самом деле  </span>" + a + " + " + b + "<span class='vernyotvet'> = " + (a+b)+"</span>";}
        }
JS определяет правильно ли введен ответ (сумма двух чисел) в поле input.
Бывает так, что JS складывая 54,6 и 3,91 получает 58,51000000005. Почему так и как исправить?
Чтобы было понятней, я прикрепил ссылку на видео.

YouTube


0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.05.2020, 21:54
Ответы с готовыми решениями:

сложение десятичных дробей
помогите реализовать такие задачи 1)сложение десятичных дробей 2)сложение обыкновенных дробей в десятичное число 3)перевод...

Сложение десятичных дробей
Здравствуйте, как во флеш сложить десятичные дроби, при обычном сложении он выводит на экран в виде даты (месяц, число, год)! А как...

Сложение десятичных дробей
как посчитать 0,1+0,1

7
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
17.05.2020, 22:01
Цитата Сообщение от alanat Посмотреть сообщение
Бывает так, что JS складывая 54,6 и 3,91 получает 58,51000000005. Почему так и как исправить?
Никак не исправить.
Привыкайте вещественные числа выводить в форматированном виде с указанным количеством знаков после запятой.
Например, деньги красиво выводятся с двумя знаками после запятой.

Один из способов форматирования: toFixed(2)
1
 Аватар для D_Vik
368 / 234 / 68
Регистрация: 19.07.2016
Сообщений: 833
17.05.2020, 22:01
Такая проблема не только в js, на этом форуме полно тем с этим. Если в краце, проблема примерно такая же как и 1/3. В js есть функция toFixed вроде бы, отрежте ей сколько нужно символов после точки.
2
12 / 12 / 1
Регистрация: 16.07.2012
Сообщений: 777
17.05.2020, 22:14  [ТС]
Цитата Сообщение от D_Vik Посмотреть сообщение
проблема примерно такая же как и 1/3
Проблема с 1/3 постоянная, а в моём случае не всегда. Почему?
0
 Аватар для D_Vik
368 / 234 / 68
Регистрация: 19.07.2016
Сообщений: 833
17.05.2020, 22:21
Думаю примерно поэтому, что в двоичном представлении числа, не всегда встречается неделимое типа 1/3. Как то так.

Добавлено через 59 секунд
Это нужно копать поглубже систему хранения чисел.
0
12 / 12 / 1
Регистрация: 16.07.2012
Сообщений: 777
17.05.2020, 22:28  [ТС]
Цитата Сообщение от D_Vik Посмотреть сообщение
в двоичном представлении числа
В php такая же проблема, не знаете?
0
 Аватар для D_Vik
368 / 234 / 68
Регистрация: 19.07.2016
Сообщений: 833
17.05.2020, 22:31
Скорее всего так же и в php. И ещё много где.
1
Эксперт JS
 Аватар для Iverycool
1586 / 796 / 362
Регистрация: 01.02.2019
Сообщений: 1,047
18.05.2020, 10:41
alanat, есть хорошая статья, там кроме прочих рассматривается ваша проблема и её решения https://habr.com/ru/post/312880/
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.05.2020, 10:41
Помогаю со студенческими работами здесь

Сложение двух обычных (не десятичных) дробей
В textbox1 записывается дробь формата 1/2 во второй textbox тоже самое 3/4 и на выходе должна получиться дробь такого же формата(в третьем...

Почему не всегда правильно считает сумму?
Всем хорошего дня. Помогите разобраться где ошибка. Условие задачи: пользователь вводит количество слагаемых (n) и переменную х. Нужно...

Калькулятор JS (не всегда правильно считает / не с первого раза)
Прошу помощи :help: код: http://jsfiddle.net/iBasher/8svzfueq/ Вопрос: при введении значений в поля, такое впечатление, что...

Переписать код, не используя break и найти почему не всегда считает правильно, в чём ошибка?
const nmax = 100; var a: array of real; n, i, j, imin, jmin: byte; buf, s: real; begin writeln('Введите...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru