#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int loonies, quarters ;
double amountdue, balanceowing, owing;
printf("Please enter the amount to be paid: $");
scanf("%lf", &amountdue);
loonies = amountdue / 1;
balanceowing = (amountdue - (int)amountdue);
quarters = (balanceowing / 0.25);
owing = ((int)(balanceowing*100) % 25);
printf("Loonies required: %d, balance owing $%.2lf\n", loonies, balanceowing);
printf("Quarters required: %d, balance owing $%.2lf", quarters , owing/100);
return 0;
}
Я должен поставить значение 8,68 и получить результат
Please enter the amount to be paid: $8.68
Loonies required: 8, balance owing $0.68
Quarters required: 2, balance owing $0.18
это результат, который я получаю с помощью своего решения
Please enter the amount to be paid: $8.68
Loonies required: 8, balance owing $0.68
Quarters required: 2, balance owing $0.17
почему значение возвращается owing = 0,17? 68 мод 25 = 18
это какое-то округление или усечение?
Да, проблема в усечении. Если вам нужно округление, используйте round - например, round(balanceowing * 100) `. Или все упростите, сохранив значения n центов вместо долларов, чтобы вы могли делать все с помощью целочисленной арифметики.
@rici Да, я сделал то, что вы предложили, за исключением того, что не использовал раунд. Мне было разрешено использовать только модульное и целочисленное деление. После умножения на 100 я просто разделил целыми числами вместо 0,25. После того, как я просто перебросил его в число с плавающей запятой, когда распечатал вывод, чтобы показать десятичные дроби. Спасибо за предложение





Пожалуйста, прочтите Почему бы не использовать Double или Float для обозначения валюты? и Математика с плавающей запятой не работает? и Почему числа с плавающей запятой неточны?