Как с плавающей точкой преобразовать в целое число с усечением?
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.