Подскажите новичку
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 и тд
C/C++
Приведение доли к int в с++
#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");
}
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");
}
>почему 2 и 1, а не 2 и 2.
Потому что первое 2 - на самом деле не 2, а какие-нибудь 1.999999999999999998. Просто при выводе тебе его округляет до 2. А вот при отрубании дробной части остается 1. Смекаешь?
Происходит это из-за невозможности точной записи некоторых десятичных дробей в двоичном виде - твои 99.98 изначально записываются с какой-то погрешностью, а дальше все заверте...
Потому что первое 2 - на самом деле не 2, а какие-нибудь 1.999999999999999998. Просто при выводе тебе его округляет до 2. А вот при отрубании дробной части остается 1. Смекаешь?
Происходит это из-за невозможности точной записи некоторых десятичных дробей в двоичном виде - твои 99.98 изначально записываются с какой-то погрешностью, а дальше все заверте...
Пиши 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
Так как значение 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
занимательная арифметика )) я представление чисел с плав. точкой забыл сразу как перелистнул страницу.
однако вот:
https://onlinegdb.com/Bkhm5D0EP
однако вот:
https://onlinegdb.com/Bkhm5D0EP
int ii = round(d);
тип int содержит значения в диапазоне от -2147483648 до 2147483647, притом что они являются целочисленные, т. е. без дробной части. А double содержит числа в диапазоне от 4.9E-324 до 4.9E-324. Т. е. при конвертации может произойти переполнение и/или не учитывание дробной части.
тип int содержит значения в диапазоне от -2147483648 до 2147483647, притом что они являются целочисленные, т. е. без дробной части. А double содержит числа в диапазоне от 4.9E-324 до 4.9E-324. Т. е. при конвертации может произойти переполнение и/или не учитывание дробной части.
Похожие вопросы
- Программа на C++ с переводом Char в Int и наоборот при переводе возвращает НИЧЕГО
- Объсните пожалуйста значение скобок в int(*ptr)[10] и разницу с int(*ptr)[10]=new int[5][10]. (Подробности в описании)
- Различие указателей int *; и char *;
- Язык С++ : есть ли разница между этими двумя операциями? 1) int m = (int)n; 2) int m = int(n).
- Strlen для int массивов.(Си)
- При присвоении i++; или ++i; разница есть а вот есть ли разница при присвоении int &i; int& i; int* i; int *i;
- Что за числа выводятся при переполнении int в C++?
- Здраствуйте, я не понимаю что означает "int" и "main" можете обьяснить)
- Неявное приведение типов в С
- Определение числа в строке int или float