Разница между десятичной, плавающей и двойной в .NET?

Вы не можете с конкретным синтаксисом, который вы описываете, из-за времени, когда они оцениваются. Причина, по которой приведенная в примере функция работает, заключается в том, что вызов функции f (i-1) внутри тела функции заключается в том, что разрешение имени f не выполняется до тех пор, пока функция не будет фактически называется. В этот момент f существует в рамках выполнения, так как функция уже была оценена. В случае примера класса ссылка на имя класса просматривается во время определения определения класса. Таким образом, он еще не существует в локальном масштабе.

В качестве альтернативы желаемое поведение может быть выполнено с использованием метакласса, подобного такому:

class MetaA(type):

    def __init__(cls):
        some_func(cls)

class A(object):
    __metaclass__=MetaA
  # do something
  # ...

Используя этот подход, вы можете выполнять произвольные операции над объектом класса в то время, когда класс оценены.

1961
задан PC Luddite 11 July 2016 в 18:33
поделиться

3 ответа

float и double плавание двоичный файл типы точки . Другими словами, они представляют число как это:

10001.10010110011

двоичное число и местоположение двоичной точки оба кодируются в значении.

decimal плавание десятичное число тип точки. Другими словами, они представляют число как это:

12345.65789

Снова, число и местоположение десятичное число точка оба кодируется в значении †“, это - то, что делает decimal все еще тип с плавающей точкой вместо типа фиксированной точки.

важная вещь отметить состоит в том, что люди привыкли представлять нецелые числа в десятичной форме и ожидают точные результаты в десятичных представлениях; не все десятичные числа являются точно представимыми в двоичной плавающей точке †“0.1, например, †“поэтому при использовании двоичного значения с плавающей точкой, Вы на самом деле получите приближение к 0,1. Вы все еще получите приближения, когда использование плавающей десятичной точки также †“результат деления 1 на 3 не может быть точно представлено, например.

Что касается того, что использовать когда:

  • Для значений, которые являются "естественно точными десятичными числами", хорошо использовать decimal. Это обычно подходит для любых понятий, изобретенных людьми: финансовые значения являются самым очевидным примером, но также существуют другие. Считайте счет данным дайверам или конькобежцам, например.

  • Для значений, которые являются большим количеством артефактов природы, которая не может действительно измеряться точно так или иначе, float / double, являются более соответствующими. Например, научные данные были бы обычно представлены в этой форме. Здесь, исходные значения не будут "по десятичной системе точны" для начала, таким образом, для ожидаемых результатов не будет важно поддержать "десятичную точность". Плавающие типы двоичной точки намного быстрее для работы с, чем десятичные числа.

2168
ответ дан Liam 12 July 2016 в 04:33
поделиться
  • 1
    Спасибо! Я нахожу, что код стиля Python, кажется, идеально подходит для записи псевдокода: уберите и краткий! – coobird 27 February 2009 в 16:10

Точность является основным различием.

Плавание - 7 цифр (32 бита)

Двойной -15-16 цифр (64 бита)

Десятичное число -28-29 значащих цифр (128 битов)

Десятичные числа имеют намного более высокую точность и обычно используются в рамках финансовых приложений, которые требуют высокой степени точности. Десятичные числа намного медленнее (до 20X времена в некоторых тестах), чем двойное/плавающее.

Десятичные числа и Плавают/Удваивают, не может быть сравнен без броска, тогда как Плавания и Удваиваются, может. Десятичные числа также позволяют кодирование или конечные нули.

float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);

Результат:

float: 0.3333333  
double: 0.333333333333333  
decimal: 0.3333333333333333333333333333
1019
ответ дан Martin Backasch 12 July 2016 в 04:33
поделиться
  1. Double и float могут быть разделены на целое число без исключения как во время компиляции, так и во время выполнения.
  2. Десятичное число не может быть разделено на целое число ноль. Если вы это сделаете, компиляция всегда завершится ошибкой.
28
ответ дан 22 November 2019 в 20:02
поделиться
Другие вопросы по тегам:

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