проблема atof("0.7") = 0.6999999999

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Sevko
Сообщения: 4
Зарегистрирован: 12 июн 2007, 13:32

12 июн 2007, 14:01

Ребята, подскажите ка с этим бороться. нигде не могу найти объяснения этому :confused:
DeeJayC
Сообщения: 492
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

12 июн 2007, 14:39

это не ошибка. прими, как должное. а что ты с ним делать будешь?
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Sevko
Сообщения: 4
Зарегистрирован: 12 июн 2007, 13:32

12 июн 2007, 15:22

Я потом умножаю на количесто (это цена) и получаю сумму, которую вывожу юзеру.
Проблева в том, что у меня осекаются цифры, начиная с 3-й после точки (не округляются). И получается 0.70*10штук = 6.90. Округления я не нашел в Visual C++.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

12 июн 2007, 16:15

Функции для округления - нет. Нужный результат даёт формула: (long)(dSomeDouble + 0.5). Это округление до целых. Если нужно округлить до некой цифры после запятой, то можно умножить число на 10 в этой сепенеи, воспользоваться приведённой формулой, затем разделить на 10 в этой степени.

А вообще наиболее правильно форматировать число при выводе. Функции форматирования всегда имеют возможность указывать точность вывода плавающих чисел. Например, в случае printf - нужно воспользоваться темплэйтом ".2f", что обозначает округление до второй цифры после запятой.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Sevko
Сообщения: 4
Зарегистрирован: 12 июн 2007, 13:32

12 июн 2007, 17:01

спасибо за совет. при выводе - это понятно. но иногда надо и хранить округленные. вообщим все в наших руках, я так понял !!
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

12 июн 2007, 18:05

*Никогда* *Не при каких условиях* не используй плавающую запятую при работе с деньгами. *Никогда*, слышишь? Перепиши программу. Посмотри на класс BigDecimal в Java - может быть для С++ есть что-то подобное.
Производи расчеты только в копейках (долях копеек), используй 64-битовое целое.
2B OR NOT(2B) = FF
DeeJayC
Сообщения: 492
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

15 июн 2007, 15:14

Absurd, бугага!
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

15 июн 2007, 16:04

DeeJayC писал(а):Absurd, бугага!
Чего не так? Общеизвестный факт - флоаты не предназначенв для работы с деньгами
2B OR NOT(2B) = FF
Sevko
Сообщения: 4
Зарегистрирован: 12 июн 2007, 13:32

22 июн 2007, 15:00

((long)(0.7*100 + 0.5))/100.0 =0.69999999999999996
Ответить