проблема atof("0.7") = 0.6999999999
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Ребята, подскажите ка с этим бороться. нигде не могу найти объяснения этому
-
- Сообщения: 492
- Зарегистрирован: 17 фев 2004, 11:26
- Откуда: Ленинград (который Город на Неве)
- Контактная информация:
это не ошибка. прими, как должное. а что ты с ним делать будешь?
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)
viel spass, DeeJayC
viel spass, DeeJayC
Я потом умножаю на количесто (это цена) и получаю сумму, которую вывожу юзеру.
Проблева в том, что у меня осекаются цифры, начиная с 3-й после точки (не округляются). И получается 0.70*10штук = 6.90. Округления я не нашел в Visual C++.
Проблева в том, что у меня осекаются цифры, начиная с 3-й после точки (не округляются). И получается 0.70*10штук = 6.90. Округления я не нашел в Visual C++.
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Функции для округления - нет. Нужный результат даёт формула: (long)(dSomeDouble + 0.5). Это округление до целых. Если нужно округлить до некой цифры после запятой, то можно умножить число на 10 в этой сепенеи, воспользоваться приведённой формулой, затем разделить на 10 в этой степени.
А вообще наиболее правильно форматировать число при выводе. Функции форматирования всегда имеют возможность указывать точность вывода плавающих чисел. Например, в случае printf - нужно воспользоваться темплэйтом ".2f", что обозначает округление до второй цифры после запятой.
А вообще наиболее правильно форматировать число при выводе. Функции форматирования всегда имеют возможность указывать точность вывода плавающих чисел. Например, в случае printf - нужно воспользоваться темплэйтом ".2f", что обозначает округление до второй цифры после запятой.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
спасибо за совет. при выводе - это понятно. но иногда надо и хранить округленные. вообщим все в наших руках, я так понял !!
-
- Сообщения: 1213
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
*Никогда* *Не при каких условиях* не используй плавающую запятую при работе с деньгами. *Никогда*, слышишь? Перепиши программу. Посмотри на класс BigDecimal в Java - может быть для С++ есть что-то подобное.
Производи расчеты только в копейках (долях копеек), используй 64-битовое целое.
Производи расчеты только в копейках (долях копеек), используй 64-битовое целое.
2B OR NOT(2B) = FF
((long)(0.7*100 + 0.5))/100.0 =0.69999999999999996