C/C++

Приведение доли к int в с++

Подскажите новичку

double d=99.98;

d = 100.00 - d;//теперь d=0.02

d*=100;//отделяю доли от целого, теперь d=2
int ii = d;

std::cout << d<<' '<<ii; //получается 2 и 1

почему 2 и 1, а не 2 и 2. Я так понимаю, это касается только долей с 0 впереди, типа 01, 02 и тд
#include <iostream>
using namespace std;
int main() {
const auto h = 100;
auto d = 99.98;
auto i = static_cast<int>(d * h);
auto k = h - i % h;
cout << "Type: " << typeid(k).name() << "\nValue: " << k << '\n';
system("pause > nul");
}
Равиль Ефремов
Равиль Ефремов
95 183
Лучший ответ
>почему 2 и 1, а не 2 и 2.
Потому что первое 2 - на самом деле не 2, а какие-нибудь 1.999999999999999998. Просто при выводе тебе его округляет до 2. А вот при отрубании дробной части остается 1. Смекаешь?
Происходит это из-за невозможности точной записи некоторых десятичных дробей в двоичном виде - твои 99.98 изначально записываются с какой-то погрешностью, а дальше все заверте...
ЮФ
Юрий Факеев
68 486
Пиши int ii = round(d);
Так как значение double это значение с плавающей точкой. А тебе нужно точное фиксированное значение, округлённое до ближайшего большего целого значения.
Для примера попробуй добавить ещё одну переменную int V и присвой ей 2 значения: V=i*100(когда i уже равно d) и V=d*100(когда d уже равно 2.00)
Получишь: V=i*100=100, V=d*100=199.
То есть примерно d=1.9, a не 2.0, точечка потому что плавающая и отображает тебе d уже округлённое значение в терминале)))
А когда d=1.9, то при i=d=1.9 целой переменной достается только единичка, остальное обрезается i=1
BK
Bakytbek Kalmurza
37 945
занимательная арифметика )) я представление чисел с плав. точкой забыл сразу как перелистнул страницу.
однако вот:
https://onlinegdb.com/Bkhm5D0EP
Еркин Ахмадиев
Еркин Ахмадиев
25 445
int ii = round(d);
тип int содержит значения в диапазоне от -2147483648 до 2147483647, притом что они являются целочисленные, т. е. без дробной части. А double содержит числа в диапазоне от 4.9E-324 до 4.9E-324. Т. е. при конвертации может произойти переполнение и/или не учитывание дробной части.