logo
logo
Поясню. [Dervish 05/03/2017 01:59]
Первоначально в AbilityCash использовалось представление денежных сумм, аналогичное представлению от Microsoft:
A currency number stored as an 8-byte, two's complement integer, scaled by 10,000 to give a fixed-point number with 15 digits to the left of the decimal point and 4 digits to the right. This <...> resentation provides a range of 922337203685477.5807 to -922337203685477.5808.
 
The CURRENCY data type is useful for calculations involving money, or for any fixed-point calculation where accuracy is particularly important.

 
Другими словами, берем 8-байтовое двоичное значение и называем его денежкой. Если нужно показать сумму человеку, преобразуем его в десятичное число, отсчитываем 4 знака после запятой, округляем сколько нужно (обычно до двух знаков после запятой) и показываем. Зачем нужны дополнительные два знака? В них собираются ошибки округления.
 
Кстати, если в Excel-е попробовать отформатировать денежную сумму, то там максимум можно указать 4 знака после запятой. Потому что вот такое представление.
 
Как я уже сказал, первоначально в AbilityCash использовалось то же самое представление. Пока не возникло желание сделать произвольное количество знаков после запятой (сейчас для валюты можно указать количество знаков после запятой более 4). Но чтобы не возникали ошибки округления программа всегда использует для представления на два десятичных дополнительных знака больше.
 
Поэтому, если Вы видите сумму "-0.00", то на самом деле это не нулевая сумма. Это может быть и "-0.004" и "-0.0001". Просто при округлении там получается ноль. А знак я просто забыл убрать. И сейчас не знаю, нужно ли его убирать или нет.