LINUX.ORG.RU

QJsonObject и double - вместо 0.1 дает 0.099999

 ,


0

1
{
  "shit": [
    1.1,
    1.3,
    1.5,
    1.7,
    1.9,
    2.1,
    2.3
  ]
}

При загрузке через QJsonObject получаются такие значения:

QJsonArray([1.1000000000000001,1.3,1.5,1.7,1.8999999999999999,2.1000000000000001,2.2999999999999998])
Как это понимать? Откуда эти девятки лезут? Что там подмухлевать надо, кто знает? Почему 1.9 нельзя загрузить как 1.9?

Или это неизбежно по какой-то причине? Тогда буду юзать всякие ceil/floor...

★★★★★

anonymous
()
Ответ на: комментарий от Deleted

Да знаю я это! =)))

Почему при чтении из файла, без каких либо операций, происходит это? Почему я быдлокодер и то умею нормально грузить флоаты из текстовых файлов, а профессионалы из команды Qt не умеют?

Просто может кто сталкивался...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

без каких либо операций

Преобразование строки в double включает в себя операции с double. Собственно, само по себе оно тоже есть операция с double.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от mix_mix

Знает, знает. Но почему даже sscanf нормально сожрет число и не будет потери точности? Ведь число 1.9 это реально существующее и допустимое с точки зрения IEEE 754.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Хорошо, я понял, буду использоваться функции округления. Тем не менее, я не согласен. Тот же sscanf нормально скушает.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Тот же sscanf нормально скушает.

Нет. Просто при выводе будет произведено округление, поэтому будет казаться, что результат — точное 1,9.

i-rinat ★★★★★
()

1/10 не записывается в двоичной системе без потерь. Точно так же как 1/3 не записывается в десятичной системе без потерь.

d_a ★★★★★
()
Последнее исправление: d_a (всего исправлений: 2)
Ответ на: комментарий от d_a
double my = 1.9d;
qDebug("test= %.20lf", my);
test= 1.89999999999999991118

Мде... А еще 5 звездочек. Модератор три тему, мне стыдно стало =)))

Знал что точность не бесконечна (естественно) но что всю жизнь printf-ы и прочие негодяи обманывали меня настолько!.. =)

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Ты прав. Срамота! =(((

Каюсь... Просто не ожидал что запись настолько примитивного числа невозможно со 100%-й точностью...

I-Love-Microsoft ★★★★★
() автор топика
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от anonymous

Так не храни как даблы то, что ими не является.

Кста...

QList<qreal> device_sett::ja2r(QJsonArray ja)
{
	QList<qreal> r;
	foreach(QJsonValue v, ja) r.append(v.toDouble());
	return r;
}
А qDebug так показывает:
(1.1, 1.3, 1.5, 1.7, 1.9, 2.1, 2.3)
Я доволен :)

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Все вменяемые выводилки имеют дефолтом как максимум %.15f. Берегли тебя все эти годы, а тут видать кто-то правду-матку и вывел.

arturpub ★★
()
Ответ на: комментарий от I-Love-Microsoft

Ведь число 1.9 это реально существующее и допустимое с точки зрения IEEE 754.

Не пори чушь, чуши больно.

anonymous
()
Ответ на: комментарий от anonymous

Завязывай с программированием, не твое это

Надо будет написать заявление на увольнение, где там ближайший макдак? :)

Ушел плакать в подушку...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

настолько примитивного числа

насколько?

anonymous
()
17 ноября 2015 г.
Ответ на: комментарий от I-Love-Microsoft

Даже на такое тебя не хватает? Ты тупее хохла?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.