Двойное является действительно неподходящим за деньги?

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');
}
69
задан doekman 25 November 2008 в 10:52
поделиться

6 ответов

Очень, очень неподходящий. Используйте десятичное число.

double x = 3.65, y = 0.05, z = 3.7;
Console.WriteLine((x + y) == z); // false

(пример от страницы Jon здесь - рекомендовал читать;-p)

114
ответ дан Hamid Pourjam 7 November 2019 в 09:43
поделиться

С тех пор decimal использование масштабный коэффициент кратных чисел 10, числа как 0,1 могут быть представлены точно. В сущности десятичный тип представляет это как 1 / 10 ^ 1, тогда как double представил бы это как 104 857 / 2 ^ 20 (в действительности, это будет больше похоже really-big-number / 2 ^ 1023).

А decimal может точно представить любую основу 10 значений максимум с 28/29 значащими цифрами (как 0,1). double не может.

5
ответ дан Richard Poole 7 November 2019 в 09:43
поделиться

Вы вызовете нечетные ошибки эффективно путем округления. Кроме того, сравнения с точными значениями чрезвычайно хитры - обычно необходимо применять своего рода эпсилон для проверки на фактическое значение, являющееся "около" конкретного.

Вот конкретный пример:

using System;

class Test
{
    static void Main()
    {
        double x = 0.1;
        double y = x + x + x;
        Console.WriteLine(y == 0.3); // Prints False
    }
}
34
ответ дан Sam Holder 7 November 2019 в 09:43
поделиться

Да это является неподходящим.

, Если я помню правильно дважды, имеет приблизительно 17 значительного количества, поэтому обычно погрешности округления произойдут далеко позади десятичной точки. Большая часть финансового программного обеспечения использует 4 десятичных числа позади десятичной точки, которая оставляет 13 десятичных чисел для работы с так максимальным количеством, с которым можно работать для единственных операций, еще намного выше, чем государственный долг США. Но погрешности округления будут складывать со временем. Если Ваше программное обеспечение будет работать в течение долгого времени, то Вы в конечном счете начнете терять центы. Определенные операции сделают это хуже. Например, добавление больших сумм к небольшим количествам вызовет значительную потерю точности.

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

редактирование
Согласно этому сайту , который http://msdn.microsoft.com/en-us/library/678hzkk9.aspx Удваивает на самом деле, имеет 15 - 16 значащих цифр вместо 17.

@Jon десятичное число Стрельбы по тарелочкам более подходит, чем дважды из-за его более высокой точности, 28 или 29 значительных десятичных чисел. Это означает меньше шанса накопленных погрешностей округления, становящихся значительным. Типы данных фиксированной точки (т.е. целые числа, которые представляют центы или 100-й из цента как, я видел используемый) как упоминания Boojum, на самом деле лучше подходят.

7
ответ дан Mendelt 7 November 2019 в 09:43
поделиться

Мое понимание - то, что большинство финансовых систем выражает валюту с помощью целых чисел - т.е. считая все в центах.

двойная точность IEEE на самом деле может представлять все целые числа точно в диапазоне-2^53 через +2^53. (Восхищение хакера, стр. 262), Если Вы используете только дополнение, вычитание и умножение, и сохраняете все к целым числам в этом диапазоне тогда, что Вы не должны видеть потерю точности. Я очень опасался бы разделения или более сложных операций, как бы то ни было.

4
ответ дан Boojum 7 November 2019 в 09:43
поделиться

Нет взаимное завещание всегда имеет погрешности округления, использует "десятичное число", если Вы находитесь на.Net...

0
ответ дан Thomas Hansen 7 November 2019 в 09:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: