| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Число с плавающей строкой в строку |
| Автор: cupper 25.4.2011, 09:47 | ||||||
| Нужно преобразовывать число с плавающей точкой (представленное в виде класса, мантиса + экспонента) в строку. В классе есть метод перевода числа в double, он не подходит так как в некоторых случаех сбивается точность и получается не совсем то что хотелось получить. Написал вот такую функцию
Проверил на таком наборе данных
Получил следующее
если я правильно понял теорию, то все правильно. Тему создал что бы точность убедится в том что не упустил не каких деталей в числах с плавающей точкой. Если говорить кратко, то 1. если экспонента > 0 то мы просто к мантиссе прибавляем в конце это количество нулей. 2. если экспонента = 0 мы оставляем число как оно есть в мантиссе. 3. если экспонента < 0, то нужно производить отсчет с права на лево в мантиссе на абсолютное значение мантиссы, дополняя его с лева нулями, и после первого нуля с левой стороны ставить запятую. Вроде больше нету других вариантов ? |
| Автор: xvr 25.4.2011, 12:37 |
| А как у вас должно напечататься Decimal(3475, -1000) или Decimal(3475, 1000) ? Добавлено через 32 секунды Кроме того, у вас экспонента десятичная? |
| Автор: borisbn 25.4.2011, 12:59 | ||||||
вроде всё правильно. Я б переделал последний if так
просто, чтобы убрать 2 insert'а, но IMHO это некритично. Ещё б передавать символ разделителя разрядов. По-умолчанию пусть будет '.'
Ну ище пару моментов. Зачем в ф-ции decimal_to_string, возвращающей копию строки, возвращаемое значение (копия) const ?
отладочная фигня ? |
| Автор: cupper 25.4.2011, 22:06 | ||||||||||
Decimal(3475, -1000) = 0.00000...003475 Decimal(3475, 1000) = 347500000...0000 где нулей в первом случаем будет 1000 - len("3475") а во втором случае 1000 нулей добавится. да экспонента и мантисса целы числа. Мантисса 64 разрядная, экспонента 32 разрядная. Не я архитектор класса, но я столкнулся с тем что нет нормального способа его представления в строку.
да, так по лучше смотрится. Про конст тут такая заморочка
ошибка допущенная по глупости всплывет сразу. Без const будет epic fail. Об этом во многих книжках пишут. Вот приучил себя к хорошему стилю.
она самая
для целостности картины, нужно. Для моей задачи нет необходимости. |
| Автор: borisbn 25.4.2011, 23:02 |
в данном случае не будет (у std::string нет оператора приведения ни к bool, ни к int ни к указателю), но в общем случае за совет спасибо. Попробую тоже принять для себя такое правило |
| Автор: mes 26.4.2011, 01:11 |
нельзя ли уточнить, в чем проявляется разница при наличии/отсутствия const в примере ? |
| Автор: volatile 26.4.2011, 02:18 | ||
mes, при конст - компилер выдаст ошибку, что надо L-value и т.д. При не конст - он проглотит, ну может выдаст воринг (хотя по умолчанию, напрмер, студия даже воринг не выдает в таких случаях) Подразумевается, что здесь программер опечатался и хотел: if(Decimal_to_string(...) == "34.75" всмысле два ==, а не одно = |
| Автор: volatile 26.4.2011, 03:09 |
| mes, Вот покопался, нашел у Мейерса, ТС просто не совсем удачный пример с ифом привел. Мейерс С. - Эффективное использование C++. 55 верных советов улучшить структуру и код ваших программ.(3-изд) ![]() |
| Автор: mes 26.4.2011, 03:18 | ||
ага этот пример показательный, спасибо |
| Автор: cupper 26.4.2011, 08:34 | ||||
В общем случае да. У меня же не стоит задача в которой такие числа хоть когда то смогли бы фигурировать. В общем мое решение для моей области применения, но в общем случае оно на врядли подойдет, вы правы. |