Раунд с плавающими значениями

Я разрабатываю кассовый аппарат, в котором мне нужно сравнить 2 значения с плавающей запятой, и я получаю ошибку каждый раз при сравнении, потому что я не могу округлить разницу в сумме до 2 десятичных цифр и сравнить ее со значениями.

для например. если сумма, уплаченная покупателем, составляет 60,36, а выставленный счет на 30,24, выходящая разница составляет 30,120001. Я даже пытался использовать функцию пола, чтобы округлить его до двух десятичных цифр: floorf(diff*100+.5)/100; но это не работает.

Как мне округлить десятичные цифры и использовать их при разработке кассового аппарата??


person user2227862    schedule 10.04.2013    source источник
comment
Вы не должны сравнивать значения с плавающей запятой.   -  person squiguy    schedule 10.04.2013
comment
Неправильно, он не должен использовать поплавки для денежных значений. Сравнивать их можно, если только вы не используете ==.   -  person ThiefMaster    schedule 10.04.2013
comment
Вот почему (не использовать поплавки), stackoverflow.com/questions/3730019/   -  person Austin Phillips    schedule 10.04.2013


Ответы (1)


Вы не должны использовать двоичную плавающую точку для обработки денежных сумм. Есть много проблем, связанных с округлением и неточным характером чисел с плавающей запятой. Например, вы не сможете точно представить 0.1 как float.

Вместо этого используйте арифметику с фиксированной точкой.

person NPE    schedule 10.04.2013
comment
Тогда как мне использовать выполнение вычислений для значений с плавающей запятой, таких как .01 или .05? - person user2227862; 10.04.2013
comment
@user2227862 user2227862 Используйте целочисленные типы для хранения количества центов. - person Pascal Cuoq; 10.04.2013