Какова цель Десятичного числа. Один, Десятичное число. Нуль, Десятичное число. MinusOne в .NET

Переустановка lxml из pkgs / main channel из репозитория anaconda позволяет решить проблему:

conda install lxml

Будут обновлены следующие пакеты:

libxml2 conda-forge :: libxml2- 2.9.8-h9ce36c8_1 ~ -> pkgs / main :: libxm l2-2.9.9-h464c3ec_0 libxslt
conda-forge :: libxslt-1.1.32-heafd4d3_ ~ -> pkgs / main :: libxs lt-1.1.33-h579f668_0

Следующие пакеты будут заменены на канал с более высоким приоритетом: ... lxml
conda-forge :: lxml-4.3.2-py37heafd4d3_0 - -> pkgs / main :: lxml- 4.3.2-py37h1350720_0 ...

63
задан goodeye 26 February 2013 в 20:04
поделиться

4 ответа

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

Если вы используете рефлектор и копаете BCL, вы заметите, что MinusOne и Zero используются только во время выполнения VB. Он существует главным образом для обслуживания преобразований между десятичными и логическими значениями. Почему MinusOne по совпадению появился сегодня в отдельном потоке ( ссылка )

Как ни странно, если вы посмотрите на значение Decimal.One, которое вы ' Заметьте, это используется нигде.

Относительно того, почему они явно определены ... Я сомневаюсь, что есть веская и быстрая причина. Там , по-видимому, не имеет конкретной производительности, и лишь немного удобной меры, которую можно отнести к их существованию. Мое предположение состоит в том, что они были добавлены кем-то во время разработки BCL для их удобства и просто никогда не удалялись.

РЕДАКТИРОВАТЬ

Вскочил в const вопрос немного больше после комментария @Paleta. Определение C # для Decimal.One использует модификатор const , однако он генерируется как статический только для чтения на уровне IL. Компилятор C # использует несколько приемов, чтобы сделать это значение практически неотличимым от const (например, встроенных литералов). Это будет отображаться на языке, который распознает этот трюк (VB.Net распознает это, но F # нет).

30
ответ дан Community 24 November 2019 в 16:29
поделиться

Некоторые языки .NET не поддерживают десятичный тип данных, и в этих случаях он удобнее (и быстрее) записать Decimal.ONE вместо нового Decimal (1).

Класс Java BigInteger имеет также ZERO и ONE, по той же причине.

19
ответ дан mihi 24 November 2019 в 16:29
поделиться

Мое мнение о том, что они существуют, чтобы помочь избежать магических чисел.

Магические числа в основном в любом месте вашего кода, где у вас есть число aribtrary. Например:

int i = 32;

Это проблематично в том смысле, что никто не может сказать , почему мне присвоено значение 32, или что означает 32, или вообще должно быть 32. Это волшебно и таинственно.

В том же духе, я часто вижу код, который делает это

int i = 0;
int z = -1;

Почему они устанавливаются в 0 и -1? Это просто совпадение? Они что-то значат? Кто знает?

Хотя Decimal.One , Decimal.Zero и т. Д. Не говорят вам, что значения означают в контексте вашего приложения (возможно, ноль означает «отсутствует») , так далее), Это не для оптимизации. Обратите внимание на код C #:

public static Decimal d = 0M;
public static Decimal dZero = Decimal.Zero;

При просмотре сгенерированного байт-кода с использованием ildasm обе опции приводят к идентичным MSIL. System.Decimal является типом значения, поэтому Decimal.Zero не более «оптимален», чем просто использование литерального значения.

-1
ответ дан Orion Edwards 24 November 2019 в 16:29
поделиться

Эти 3 значения arghhh !!!

Я думаю, они могут иметь какое-то отношение к тому, что я называю конечными единицами

, скажем, у вас есть такая формула:

(x) 1,116666 + (y) = (z) 2,00000

, но x , z округляются до 0,11 и 2,00 , и вам будет предложено вычислить (y).

, поэтому вы можете подумать y = 2,00 - 1,11 . Фактически y равно 0,88 , но вы получите 0,89 . (разница составляет 0,01 ).

В зависимости от реального значения x и y результаты будут варьироваться от -0,01 до +0,01 , а в некоторых случаях при работе с несколькими замыкающими единицами и для упрощения работы вы можете проверить, равно ли конечное значение Decimal.MinusOne / 100 , Decimal.One / 100 или Decimal.Zero / 100 , чтобы исправить их.

вот как я их использовал.

-6
ответ дан 24 November 2019 в 16:29
поделиться