Как с плавающей точкой преобразовать в целое число с усечением?

int a = atof("4.60") * 100;
int b = atof("6.60") * 100;
printf("a:%d",a); //<==== here print a:459
printf("b:%d",b); //<==== here print b:660

В IEEE 754 4,60 - 4,599999999... и 6,60 - 6,5999999... Я ожидаю, что print b также покажет 659. Как работает усечение?

1 ответ

Как вы заметили 6.6 в исходном коде не совсем 6,6, а скорее 6,5999999999999996447286321199499070644378662109375. Так же, 4.6 производит 4.5999999999999996447286321199499070644378662109375.

При умножении на 100 возникает другая ошибка округления, поскольку новое значение не может быть точно представлено в плавающей точке и должно быть округлено до ближайшего представимого значения.

За 6.6 * 100, ближайшее представимое значение составляет 660.

За 4.6 * 100, ближайшее представимое значение - 459,999999999999994315658113919198513031005859375.

Другие вопросы по тегам