Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.08.2010, 00:04
VARion вне форума Посмотреть профиль Отправить личное сообщение для VARion Посетить домашнюю страницу VARion Найти все сообщения от VARion
  № 1  
Ответить с цитированием
VARion

Регистрация: Apr 2008
Сообщений: 27
Attention Ошибка умножения

Всем привет.
Обнаружил следующую ошибку:
Код:
trace(1000 * 6 * 2.2);
Выдает: 13200.000000000002.
Откуда этот остаток .000000000002. Отчего происходит, ведь здесь и числа не большие и дробь примитивная?
Аналогичная ошибка ещё: 0.7 * 11000 = 7699.999999999999, должно быть 7700.
Может кто знает, как это можно решить?


Последний раз редактировалось VARion; 28.08.2010 в 00:13. Причина: Дополнение
Старый 28.08.2010, 00:15
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 2  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
2.2 в двоичной системе - бесконечная дробь, оттого и хвост. Общего решения не существует. В данном случае можно записать выражение как 1000 * 6 * 22 / 10
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 28.08.2010, 00:21
VARion вне форума Посмотреть профиль Отправить личное сообщение для VARion Посетить домашнюю страницу VARion Найти все сообщения от VARion
  № 3  
Ответить с цитированием
VARion

Регистрация: Apr 2008
Сообщений: 27
Спасибо. Не знал этого.
У меня в программе могут быть любые дроби (заранее не известно) как быть в таком случае?

Старый 28.08.2010, 00:31
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 4  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
То, что выводится округлять, например. Что компьютер такие штуки не точно считает вроде общеизвестно. Если это что-то связанное с математикой, где нужна какая-то особая точность, то можно что-то мудрить, но тут надо уже под конкретную задачу делать.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 28.08.2010, 00:42
VARion вне форума Посмотреть профиль Отправить личное сообщение для VARion Посетить домашнюю страницу VARion Найти все сообщения от VARion
  № 5  
Ответить с цитированием
VARion

Регистрация: Apr 2008
Сообщений: 27
Про округление понятно, но не очень подходит - нужно для подсчёта стоимости.
Есть такой вариант: перед умножением каждый операнд проверять, сколько у него знаков после запятой, корректировать до целого. После получения результата делить на 1 с нужным числом нулей. Правда так и переполнение может быть ... но других вариантов пока не приходит.

Старый 28.08.2010, 00:55
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 6  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
В случаях со стоимостью у вас не любые дроби, а где только два знака после запятой. Храните тогда умноженное на 100 целое (int) значение (ну т.е. в копейках/центах). Если деньги умножаются на некий коэффициент, то посчитал, округлил в какую надо сторону и записал опять в сумму на счету, которая int. Я так делаю. "Квадратных рублей", т.е. когда рубли множатся на рубли обычно не бывает %)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 28.08.2010, 00:59
VARion вне форума Посмотреть профиль Отправить личное сообщение для VARion Посетить домашнюю страницу VARion Найти все сообщения от VARion
  № 7  
Ответить с цитированием
VARion

Регистрация: Apr 2008
Сообщений: 27
Спасибо большое, очень помогли!
Так и сделаю.

Старый 28.08.2010, 01:00
Dimitry_II вне форума Посмотреть профиль Отправить личное сообщение для Dimitry_II Найти все сообщения от Dimitry_II
  № 8  
Ответить с цитированием
Dimitry_II

Регистрация: Jan 2010
Сообщений: 211
Я тоже с суммами оперирую как с числом центов, а не баксов - удобно хранить интеджер, удобно и точно оперировать, а как показывать - это уже фасад.

Старый 28.08.2010, 01:13
VARion вне форума Посмотреть профиль Отправить личное сообщение для VARion Посетить домашнюю страницу VARion Найти все сообщения от VARion
  № 9  
Ответить с цитированием
VARion

Регистрация: Apr 2008
Сообщений: 27
Вот будет на одного теперь больше, кто этим методом пользуется.
Интересно получается, вроде бы программирование уже высокоуровневое давно, а всё же программисту нужно понимать как что внутри работает ... ))

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:28.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
flex , ошибка , умножение
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 12:28.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.