Почему static_cast возвращает неправильное значение?

Доброго времени суток. Изучаю C++ по книге Р. Лафоре "ООП в с++".
Возникла проблема в программе
#include <iostream>
#include <clocale>
using namespace std;
int main()
{
	setlocale(LC_CTYPE, "rus");
	float a, c, k;
	int b, z;
	cout << "Введите количество фунтов: " << endl;
	cin >> a;
	b = static_cast<int>(a);
	c = a - b;
	c *= 20;
	z = static_cast<int>(c);
	k = c - z;
	k *= 12;
	k = static_cast<int>(k);
	cout << "Эквивалентная сумма в старой форме записи: J" <<b<<"."<<z<<"."<<k<< endl;
	return 0;
}

Если пользователь вводит к примеру 8.65, то после строк
c *= 20;
z = static_cast<int>(c);

получается, что z=12. Хотя на самом деле должно быть равно 13.
Пусть c=0.65*20, тогда z = static_cast(13). И соответственно при выделении целой части от 13, мы должны получить 13. Помогите разобраться в проблеме.
  • Вопрос задан
  • 2372 просмотра
Решения вопроса 2
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
0.65 не может быть представлено в памяти как ровно 0,65
Используйте double вместо float
Ответ написан
Вводим 8,65, вычесляем и получаем:

1f218c60dd7a45649d3d8c1e4080f4fa.jpg

Както так;)

Чтобы работало првильно можно сделать так:
double a, c, k;
	int b, z;

Ы.З. Пользуйтесь отлачиком в непонятных ситуациях.
Ы.З. Это просто магия:)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
0.65 = 65 / 100 = 13 / (2 * 2 * 5). Эта дробь непредставима в конечном виде как двоичное число, поскольку её знаменатель содержит числа, отличные от 2. Поэтому вычисления с её участием -- приближённые.
Ответ написан
Комментировать
AxisPod
@AxisPod
Дык используйте специально предназначенные для этого функции из math.h (cmath). А так вам даже double не во всех ситуациях поможет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы