Как да умножа това в C?

Пишех програма, която приема входни данни в долари от потребителя и ги преобразува в int, което са центовете. Потребителят винаги ще въвежда или цяло число, или число с плаваща запетая с максимум 2 знака след десетичната запетая. Искам да го преобразувам в int чрез умножение по 100. Програмата обаче не работи за някои от числата.

int cents = (dollars*100);

dollars е входът с плаваща запетая, който потребителят дава. Например, ако I dollars = 4,2, cents става 419,999. Как мога да коригирам този проблем?


person Shaurya Gupta    schedule 25.01.2014    source източник
comment
използвайте голям тип цяло число като long cents, за да съхраните цялата сума (напр. $14000,99 е 1400099 цента) и просто изрично отпечатвайте долари и цента, когато печатате. напр. long cents = 1400099; printf("You've got $%ld.%02ld\n", cents/100, cents%100);   -  person Brandin    schedule 25.01.2014


Отговори (3)


Просто коригирайте стойността по следния начин:

int cents = (int)(dollars*100 + 0.5);
person Paul Evans    schedule 25.01.2014
comment
Защо произволно добавяте 0,5? Искате ли банката да загуби пари - person Brandin; 25.01.2014

Не можете да го коригирате. Числата с плаваща запетая нямат "десетични знаци". Те винаги са приблизителни и размити. Никога не използвайте числа с плаваща запетая за пари - това е едно от най-важните правила на софтуера, който се занимава с всичко финансово. Прочетете въведеното като низ (%s) и съберете центовете, като намерите десетичната запетая в низа и след това използвате atoi върху частите преди и след .

person librik    schedule 25.01.2014
comment
+1 Съгласен. Но на практика никога не съм виждал някой да използва нещо друго освен двойни за изчисления, направени в застрахователния сектор. В моята компания дори е писмено изискване. С всички проблеми това води до... - person Axel; 25.01.2014
comment
@Axel защо не използваш специализиран клас за работа с пари и просто не направиш използването на това изискването за работа с парите. Нарича се разделяне на грижите - person Brandin; 25.01.2014
comment
Изискването е да се използва машинният тип данни с двойна точност. Внедряването на специализиран клас, който прави всичко точно като двойно, просто би довело до допълнителни разходи. - person Axel; 25.01.2014
comment
И хората питат защо COBOL все още съществува. Точно това е нещото, с което COBOL (което се използваше навсякъде в застрахователния сектор) е фантастично. Чудя се дали този, който е написал изискването на вашата компания, не е разбрал от какво се отказват, когато са преминали от PIC спецификатори (т.е. фиксиран десетичен знак) към двойни, когато компанията смени езиците. - person librik; 26.01.2014

1) Вероятно можете да коригирате своя прецизен модел с плаваща запетая в свойствата на вашия проект
2) Когато конвертирате от float към int, винаги е удобно да добавите малко, за да позволите закръгляване надолу:

int cents = ((dollars*100.0)+0.5);
person noelicus    schedule 25.01.2014