void printBin(unsigned int num){
char str[sizeof(num)*8];
char *p = str;
for(*p='0'; num; num/=2) { *p++='0'+num%2; } //store remainders
for(--p; p>=str; putchar(*p--)) {;} //print remainders in reverse
putchar('\n');
}
Очень, очень неподходящий. Используйте десятичное число.
double x = 3.65, y = 0.05, z = 3.7;
Console.WriteLine((x + y) == z); // false
(пример от страницы Jon здесь - рекомендовал читать;-p)
С тех пор decimal
использование масштабный коэффициент кратных чисел 10, числа как 0,1 могут быть представлены точно. В сущности десятичный тип представляет это как 1 / 10 ^ 1, тогда как double
представил бы это как 104 857 / 2 ^ 20 (в действительности, это будет больше похоже really-big-number / 2 ^ 1023).
А decimal
может точно представить любую основу 10 значений максимум с 28/29 значащими цифрами (как 0,1). double
не может.
Вы вызовете нечетные ошибки эффективно путем округления. Кроме того, сравнения с точными значениями чрезвычайно хитры - обычно необходимо применять своего рода эпсилон для проверки на фактическое значение, являющееся "около" конкретного.
Вот конкретный пример:
using System;
class Test
{
static void Main()
{
double x = 0.1;
double y = x + x + x;
Console.WriteLine(y == 0.3); // Prints False
}
}
Да это является неподходящим.
, Если я помню правильно дважды, имеет приблизительно 17 значительного количества, поэтому обычно погрешности округления произойдут далеко позади десятичной точки. Большая часть финансового программного обеспечения использует 4 десятичных числа позади десятичной точки, которая оставляет 13 десятичных чисел для работы с так максимальным количеством, с которым можно работать для единственных операций, еще намного выше, чем государственный долг США. Но погрешности округления будут складывать со временем. Если Ваше программное обеспечение будет работать в течение долгого времени, то Вы в конечном счете начнете терять центы. Определенные операции сделают это хуже. Например, добавление больших сумм к небольшим количествам вызовет значительную потерю точности.
Вам нужны типы данных фиксированной точки для денежных операций, большинство людей не возражает, если Вы теряете цент тут и там, но бухгалтеры не похожи на большинство людей..
редактирование
Согласно этому сайту , который http://msdn.microsoft.com/en-us/library/678hzkk9.aspx Удваивает на самом деле, имеет 15 - 16 значащих цифр вместо 17.
@Jon десятичное число Стрельбы по тарелочкам более подходит, чем дважды из-за его более высокой точности, 28 или 29 значительных десятичных чисел. Это означает меньше шанса накопленных погрешностей округления, становящихся значительным. Типы данных фиксированной точки (т.е. целые числа, которые представляют центы или 100-й из цента как, я видел используемый) как упоминания Boojum, на самом деле лучше подходят.
Мое понимание - то, что большинство финансовых систем выражает валюту с помощью целых чисел - т.е. считая все в центах.
двойная точность IEEE на самом деле может представлять все целые числа точно в диапазоне-2^53 через +2^53. (Восхищение хакера, стр. 262), Если Вы используете только дополнение, вычитание и умножение, и сохраняете все к целым числам в этом диапазоне тогда, что Вы не должны видеть потерю точности. Я очень опасался бы разделения или более сложных операций, как бы то ни было.
Нет взаимное завещание всегда имеет погрешности округления, использует "десятичное число", если Вы находитесь на.Net...