С++ float to int

Возможно, это очень простой вопрос, но я не мог получить ответ. Я давно искал (теперь Google считает, что я отправляю автоматические запросы http://twitter.com/michaelsync/status/17177278608)..

int n = 4.35 *100;
cout << n;

Почему результат становится "434" вместо "435"? 4.35 * 100 = 435, которое является целочисленным значением, и это должно быть назначено целочисленной переменной "n", правильно?

ИЛИ Скомпилирован ли компилятор С++ 4.35 до целого числа до умножения? Я думаю, что это не так. Почему компилятор автоматически меняет 4.35 на 4.34, который по-прежнему остается плавающим?

Спасибо.

Ответы

Ответ 1

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

Это действительно просто отправная точка, к сожалению, поскольку тогда языки вводят свои собственные недостатки, когда они делают преобразования типов и т.д. В этом случае вы просто создали ситуацию, когда константа 4.35 не может быть представлена ​​точно, и, таким образом, 4,35 * 100 больше похоже на 434.9999999999, а приведение к int составляет trunc, а не round.

Ответ 2

Если вы запустите это утверждение:

cout << 4.35

Доллары к пончикам вы получаете примерно примерно как 4.3499998821, потому что 4.35 не является точно представимым в поплавке.

Когда компилятор передает float в int, он обрезает.

Чтобы получить поведение, которое вы ожидаете, попробуйте:

int n = floor((4.35 * 100.0) + 0.5);

(Трудность с floor заключается в том, что С++ не имеет нативной функции round())

Ответ 3

Внутреннее представление 4.35 заканчивается 4.349999999 или аналогичным. Умножение на 100 сменяет десятичное число, а .9999 выгружается (усекается) при преобразовании в int.

Изменить: искал ссылку Ник.:)

Ответ 4

Числа с плавающей запятой не работают таким образом. Многие (большинство, технически бесконечное число...) значений не могут быть сохранены или обработаны точно как плавающая точка. 4,35, похоже, один из них. Он становится хранимым как нечто, что на самом деле ниже 4.35, следовательно, ваш результат.

Ответ 5

Когда a float преобразуется в int, дробная часть усекается, преобразование не принимает ближайший int к значению float.

4.35 не может быть точно представлено как float, ближайшее представимое число (мы можем вывести) очень немного меньше, чем 4.35, т.е. 4.34999..., поэтому при умножении на 100 вы получаете 434.999...

Если вы хотите преобразовать положительный float в ближайший int, вы должны добавить 0.5 перед преобразованием в int.

например.

int n = (4.35 * 100) + 0.5;
cout << n;