Чтение строки в плавающем производит неправильную точность

0

Теперь я понимаю, что float менее точны, чем double, но объясняет это, когда у меня есть std::string:

"7.6317"

и я делаю:

float x = atof(myString.c_str());

ожидается получение 7.63170004? Есть ли способ, которым я могу указать назначение x только для чтения первых четырех знаков после запятой? Или это из-за того, как в поплавочном представлении хранится номер 7.6317?

  • 0
    Нет, float не может хранить X десятичных знаков. Вы можете сказать это печатать с определенной точностью. И double имеет такое же поведение. И используйте std::stof .
  • 2
    Ближайший к 7.6317 поплавок 7.631700038909912109375
Теги:
floating-point
floating-accuracy
floating-point-precision

3 ответа

0

Да. Это ожидаемо. Это так называемая ошибка с плавающей запятой.

  • 2
    Это действительно отвечает на вопрос «Ожидается ли это».
  • 0
    1. Он спросил, стоит ли ожидать - я ответил на это, дав советы, на что посмотреть. 2. Я не могу комментировать любые посты, кроме моего банкомата. 3. Я бы, наверное, пометил этот пост.
0

Некоторые литералы с плавающей запятой не имеют точного представления на компьютере, даже если - в десятичной системе обозначений - число кажется безобидным. Это связано с тем, что компьютер использует 2 в качестве базы. Таким образом, даже если число может иметь конечное представление в базе 10, оно может отсутствовать в базе 2.

0

вы можете сделать это так:

float x = floorf(val * 10000) / 10000;

Я думаю, он должен работать! см. См.

  • 1
    Что это делает? Число уже округлено до четырех знаков после запятой.
  • 0
    Да, верно, я забыл ошибку с плавающей точкой с Матиссом и показателем степени. СРЮ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню