Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt. Приведение типа double к Q_INT64 или Q_LLONG / 6 сообщений из 6, страница 1 из 1
09.02.2007, 10:27
    #34318067
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt. Приведение типа double к Q_INT64 или Q_LLONG
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
double D;
char *sqldata;
short sqlscale;

sqlscale = - 2 ;
sqldata = (char*) malloc( 8 );
D =  116 . 05 ;
D /= pow( 10 , sqlscale);
*(Q_INT64*) sqldata = (Q_INT64) D;

/*Читаю из sqldata, там 11604 вместо 11605 */

/*Если делать так*/
*(Q_INT64*) sqldata = QVariant(D).asLongLong(); // То всё путём. Там 11605
Как обойтись без QVariant ? Я к пятнице уже отупел.
...
Рейтинг: 0 / 0
09.02.2007, 10:33
    #34318093
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt. Приведение типа double к Q_INT64 или Q_LLONG
Попробуй round() перед приведением к 64.

Зачем используешь char* не понял.
...
Рейтинг: 0 / 0
09.02.2007, 10:38
    #34318108
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt. Приведение типа double к Q_INT64 или Q_LLONG
AkhЗачем используешь char* не понял.Это Borland использует в структуре XSQLVAR файл ibase.h. Я просто краткую выжимку сделал для форума.


AkhПопробуй round() перед приведением к 64.Сейчас попробую.
...
Рейтинг: 0 / 0
09.02.2007, 11:32
    #34318357
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt. Приведение типа double к Q_INT64 или Q_LLONG
Код: plaintext
*(Q_INT64*) sqldata = (Q_INT64) round(D / pow( 10 , sqlscale)) 
- Всё в порядке работает.
Спасибо.

Только не пойму чем double после round() круче чем простое приведение типов и круче чем ceil() и floor() - их я тоже юзал, но не помогало.
...
Рейтинг: 0 / 0
09.02.2007, 12:02
    #34318499
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt. Приведение типа double к Q_INT64 или Q_LLONG
double round(double x);
ОПИСАНИЕ
Эти функции округляют аргумент x до ближайшего целого
значения, но при округлении в половине случаев использует
направление округления от нуля (независимо от текущего
направления округления), вместо округления так, как это
делает функция rint().


double nearbyint(double x);
ОПИСАНИЕ
Функции nearbyint округляют аргумент до целого значения в
формате числа с плавающей запятой, используя текущее
направление округления и без вызова исключительной ошибки
inexact.

Функции rint делают то-же самое, но вызовут исключительную
ошибку inexact, если результат отличается по значению от
аргумента.



Кто-нибудь может прокомментировать какую лучше использовать, чтобы получить гарантированный результат?

Суть вот в чём:
Пользователь ввёл число мне его необходимо в базу записать. Но InterBase типы NUMERIC хранит как INT64.
При считывании 11605 * pow(10, -2) получаем 116.05
При записи 116.07 / pow(10, -2) получаем 11607.чего-то
приведение типа (Q_INT64) 11607.чего-то —> получаем 11606.
(Q_INT64) round(11607.чего-то) помогает и даёт 11607

Но там double round(double x);
про какую-то половину случаев пишут. Какую функцию использовать, чтоб не нарваться на неприятности с заказчиками???
...
Рейтинг: 0 / 0
09.02.2007, 12:45
    #34318765
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt. Приведение типа double к Q_INT64 или Q_LLONG
Разобрался.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt. Приведение типа double к Q_INT64 или Q_LLONG / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]