
Ilia
17.08.2017
08:56:16

Владислав
17.08.2017
08:57:05

Ilia
17.08.2017
08:57:16
Решения чего ?
Ты просто должен поглядеть на результат и понять его примерное значение. смысла округлять 6.499999... до 6.5 нет

Google

Владислав
17.08.2017
08:58:46
Я же не сам округляю, а std::round

Ilia
17.08.2017
08:59:14
Нет смысла вообще округлять

Владислав
17.08.2017
09:00:03
в смысле?

Ilia
17.08.2017
09:01:21
Есть некий дабл, есть некий процент, нужно взять процент от дабла и округлить полученное значение. Например double = 10.0, процент = 65%, берём 65% от 10, ожидаем получить 6.5, но на практике получаем 6.4999999, из-за чего округление неправильно работает, как в общем случае такие ситуации обрабатывать?
— НЕТ СМЫСЛА ОКРУГЛЯТЬ ВООБЩЕ
Тебе нужно взять 65%, бери значение, и домножай на 0.65 и печатай. Всё.

Владислав
17.08.2017
09:02:57
Не понимаю, зачем мне его печатать? Мне это значение нужно для следующих вычислений.

Ilia
17.08.2017
09:03:01
"нужно гарантировать правильное вычисление значения. То есть как мне добиться того, что первый знак после запятой гарантировано верный?" — значение и так правильное. Тебе не нужно ничего гарантировать.
Ну, тогда используй его для следующих вычислений. Без округлений.

Владислав
17.08.2017
09:04:00
Мне нужно именно округлённое значение

Ilia
17.08.2017
09:04:23
До чего округлённое ?

Владислав
17.08.2017
09:04:35
до целого

Ilia
17.08.2017
09:04:39
Что ты считаешь в конечном итоге ?

Antony
17.08.2017
09:05:54
Мне нужно именно округлённое значение
А как выглядит задача целиком? Что надо делать с дальнейшим числом?
Дайте больше контекста. Возможно что нужно использовать decimal, либо совершенно по другому подходить к вычислениям

Google

Владислав
17.08.2017
09:06:17
Ок, сейчас опишу контекст

Ilia
17.08.2017
09:06:19
до целого
Ну ок, http://www.cplusplus.com/reference/cmath/round/?kw=round

Eugene
17.08.2017
09:06:29
до целого
> 10.0, процент = 65%, берём 65% от 10, ожидаем получить 6.5, но на практике получаем 6.4999999, из-за чего округление
Что ты считаешь "целым"?
Существует стандарт IEEE 754, там есть 5 методов округления.
https://en.wikipedia.org/wiki/IEEE_754#Rounding_rules

Александр
17.08.2017
09:09:21

Владислав
17.08.2017
09:10:27

Александр
17.08.2017
09:11:06
» std::pow(10, 5);
ужас

Владислав
17.08.2017
09:11:31
почему?

Ilia
17.08.2017
09:14:36

Александр
17.08.2017
09:14:47
почему?
это же константа, причём нормальная, а не 197491238

Владислав
17.08.2017
09:15:26
я не стал вводить в пример ненужные сущности

Александр
17.08.2017
09:15:58

Eugene
17.08.2017
09:16:23
Могу предложить способ округления до n-знаков после запятой, который используется в Python.
https://github.com/python/cpython/blob/master/Objects/floatobject.c#L987
Либо используй decimal-like решения, если тебе действительно нужно контролировать точность дробной части.

Antony
17.08.2017
09:16:55

Владислав
17.08.2017
09:18:10
» А правильным решением будет использовать decimal
ну там всё приложение на даблах :)

Ilia
17.08.2017
09:18:39

Владислав
17.08.2017
09:18:55
это торги на форексе

Google

Eugene
17.08.2017
09:19:47

Ilia
17.08.2017
09:20:06
Ну ок, а это значение используется для точного вычисления некоей величины, скажем, маржи, или для оценки какой-то целесообразности чего-то ?

Antony
17.08.2017
09:20:16

Ilia
17.08.2017
09:20:31

Владислав
17.08.2017
09:21:07

Ilia
17.08.2017
09:21:32
Не, может быть это и допустимо, если скажем это какой-то целевой показатель вычисляется, и по нему потом строется решение — допустимо делать в double

Владислав
17.08.2017
09:21:35

Eugene
17.08.2017
09:22:07
В финансовых приложениях как раз используется decimal. Это как раз, чтобы контролировать точность до копейки.

Ilia
17.08.2017
09:22:21

Владислав
17.08.2017
09:22:55

Ilia
17.08.2017
09:23:28

Ilia
17.08.2017
09:24:14

Владислав
17.08.2017
09:24:14
ну в смысле, мне приходят данные напрямую с сервера.
тебе код апишки скинуть?) это NDA :)

Antony
17.08.2017
09:24:46
Я всё чаще убеждаюсь, что самое безобразное ПО в банках и комерческих системах, работающих с деньгами

Ilia
17.08.2017
09:24:49
Непубличный ?

Eugene
17.08.2017
09:25:03

Ilia
17.08.2017
09:25:14

Владислав
17.08.2017
09:25:40
ну вот как пример, структура, хранящая тики из их апи
struct TickAPI
{
time_t ctm; // time
double bid,ask; // normalized bid & ask
};

Google

Ilia
17.08.2017
09:26:15
Нет, ты давай ссылку на ИХ описание ИХ API, а не какие-то структуры.

Владислав
17.08.2017
09:27:28
к докам тоже доступ закрытый

Ilia
17.08.2017
09:28:34
Я просто тоже как бы на бирже работаю — у нас всё в decimal.... Reuters тоже помню обрабатывали — та же хрень... Так что пока не верю.

Eugene
17.08.2017
09:28:57
к докам тоже доступ закрытый
Я не понимаю. Я когда-то что-то делал на языке в метатрейдер (MQL вроде), всё было открыто, куча примеров и т.п. Что за закрытая платформа?

Ilia
17.08.2017
09:29:49
Ну, тогда у тебя выбор — на входе преобразовывать всё в что-то типа decimal, считать нормально, на выходе — преобразовывать обратно.
Либо считать всё в Double но тогда уже не жаловаться на погрешности расчётов, учитывать их при работе.

Владислав
17.08.2017
09:31:18
metatrader 4. Mql открыт, это для разработки советников различных. Я занимаюсь разработкой плагинов под их платформу, доки закрыты у них.

Admin
ERROR: S client not available

Eugene
17.08.2017
09:37:13

Владислав
17.08.2017
09:38:39
мне теперь в оупенсорс круглосуточно нужно коммитить, чтоб карму отмыть :)

Ioann V
17.08.2017
10:00:54

Anton
17.08.2017
10:03:23
С++ самый крутой язык программирования

Ioann V
17.08.2017
10:05:03

Владислав
17.08.2017
10:09:12

Ioann V
17.08.2017
10:09:38
Ну тут в чате есть еще один, с рысью на автарке.

Владислав
17.08.2017
10:09:45
это я

Ioann V
17.08.2017
10:09:57
Тогда ясно ;)

Владислав
17.08.2017
10:10:33
это не рысь была, а каракал

Andrei
17.08.2017
10:33:44
Хранить цену в double? Мощно.

Google

Владислав
17.08.2017
10:41:28
это очень больно, согласен

Danylo
17.08.2017
10:59:08
я думал, их вообще безопаснее в интах хранить

Andrei
17.08.2017
11:00:50
Безопаснее их хранить в спец. типах, чтобы тебе еще компилятор проверку типов энфорсил.

Александр
17.08.2017
11:21:24
и переполнения разные

Evgeniy
17.08.2017
11:24:42
и переполнения разные
если у меня будет переполнение типа в котором я записываю деньги, то можно будет забить на разработку)

Александр
17.08.2017
11:24:50

Влад
17.08.2017
11:27:32
а так должно быть, что лямбды запускается раньше, чем они вызываются?

Александр
17.08.2017
11:27:52
нет

Влад
17.08.2017
11:28:23
пример:
auto func = [some_var] () {
some code
};
func();
не дойдя до func выполнится.

Владислав
17.08.2017
11:29:31
эм, а пример рабочий можно?

Влад
17.08.2017
11:29:41
тут очень большой код.
мне нужно весь код было поместить в одну функцию.
и я все методы поместил по лямбдам.

Владислав
17.08.2017
11:30:45
ну напиши минимально рабочий пример
где твой кейс воспроизводится

Влад
17.08.2017
11:33:07
rebuild помог
странный этот кьют.

Tema
17.08.2017
11:38:46
rebuild помог
не используеш ide = не тратиш кучу времени на решение неведомых проблем которые создаёт ide