Разве Двойная точность Типа 15 цифр в C# не была?

Будьте в спящем режиме определенно поддерживает это. Из документов:

"Сгенерированные свойства являются свойствами, которым генерировала их значения база данных. Как правило, Будьте в спящем режиме, приложения должны были обновить объекты, которые содержат любые свойства, для которых база данных генерация значения. Отмечание свойств, как сгенерировано, однако, позволяет приложению делегировать эту обязанность Быть в спящем режиме. По существу, каждый раз, когда В спящем режиме, выходит, SQL ВСТАВЛЯЮТ или ОБНОВЛЯЮТ для объекта, который определил сгенерированные свойства, это сразу выпускает выбор впоследствии для получения сгенерированных значений".

свойства For, сгенерированные на вставке только, Ваше свойство, отображающее (.hbm.xml), было бы похоже:

<property name="foo" generated="insert"/>

свойства For, сгенерированные на вставке и обновлении, Ваше свойство, отображающее (.hbm.xml), было бы похоже:

<property name="foo" generated="always"/>

, К сожалению, я не знаю JPA, таким образом, я не знаю, представлена ли эта функция через JPA (я подозреваю возможно не)

, С другой стороны, необходимо быть в состоянии исключить свойство из вставок и обновлений, и затем "вручную" назвать session.refresh (obj); после того, как Вы вставили/обновили его для загрузки сгенерированного значения из базы данных.

Это - то, как Вы исключили бы свойство из того, чтобы быть используемым в операторах обновления и вставке:

<property name="foo" update="false" insert="false"/>

Снова, я не знаю, представляет ли JPA эти функции Hibernate, но Будьте в спящем режиме, действительно поддерживает их.

5
задан Broken_Window 8 September 2009 в 18:54
поделиться

6 ответов

Это не имеет ничего общего с точностью - это связано с ошибками округления представления.

System.Decimal может представлять большие числа с плавающей запятой со значительно сниженным риском возникновения любых ошибок округления, подобных той, которую вы видите. System.Single и System.Double не способны на это и округляют эти числа и создают проблемы, подобные той, которую вы видите в своем примере.

System.Decimal использует коэффициент масштабирования для хранения положения десятичной точки, что позволяет точно представить заданное число с плавающей запятой, тогда как System.Single и System.Double только приблизительно соответствуют вашему

Для получения дополнительной информации см. System.Double : может только приблизиться к десятичному числу, и что точность число с плавающей запятой определяет, как точно это число приблизительно равно десятичное число. По умолчанию Double значение содержит 15 десятичных цифр точность, хотя максимум 17 цифры хранятся внутри. В точность числа с плавающей запятой имеет несколько последствий:

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

  • Математическая операция или операция сравнения, в которой используется число с плавающей запятой. число может не дать такого же результата если используется десятичное число, потому что число с плавающей запятой может не точно приблизить десятичную дробь число.

28
ответ дан 18 December 2019 в 05:14
поделиться

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

if (Math.Abs(d1 - d2) <= Double.Epsilon) ...

Это проверяет, представлены ли d1 и d2 одним и тем же битовым шаблоном, который дает или принимает младший значащий бит.

Исправление ( Добавлено 2 марта 2015 г.)

При дальнейшем рассмотрении код должен выглядеть примерно так:

// Assumes that d1 and d2 are not both zero
if (Math.Abs(d1 - d2) / Math.Max(Math.Abs(d1), Math.Abs(d2)) <= Double.Epsilon) ...

Другими словами, возьмите абсолютную разницу между d1 и d2 , затем масштабируйте это наибольшее из d1 и d2 , и затем сравните его с Epsilon .

Ссылки
http://msdn.microsoft.com/en-us/library/system.double.epsilon. aspx
http://msdn.microsoft.com/en-us/library/system.double.aspx#Precision

8
ответ дан 18 December 2019 в 05:14
поделиться

Тип decimal реализует десятичное число с плавающей запятой, тогда как double является двоичным с плавающей запятой.

Преимущество десятичного числа в том, что оно ведет себя как человек в отношении округления, и если вы инициализируете его десятичным значением, то это значение будет сохранено точно , как вы указали. Это верно только для десятичных чисел конечной длины в пределах представимого диапазона и точности. Если вы инициализировали его, скажем, 1.0M / 3.0M, тогда он не будет сохранен точно так же, как если бы вы записали 0,33333-повторяющиеся на бумаге.

Если вы инициализируете двоичное значение FP с десятичным числом, оно будет преобразовано из в удобочитаемой десятичной форме в двоичное представление, которое редко будет точно таким же значением.

Основное назначение десятичного типа - реализация финансовых приложений, в реализации .NET он также имеет гораздо более высокую точность, чем double, однако двоичный FP напрямую поддерживается оборудованием, поэтому он значительно быстрее чем десятичные операции FP.

Обратите внимание, что double имеет точность приблизительно до 15 значащих цифр , а не до 15 знаков после запятой . d1 инициализируется 7 значащими цифрами, а не 6, тогда как d2 имеет только 1 значащую цифру. Тот факт, что они существенно различаются по величине, тоже не помогает.

однако двоичный FP напрямую поддерживается оборудованием, поэтому он значительно быстрее, чем десятичные операции FP.

Обратите внимание, что double имеет точность примерно до 15 значащих цифр , а не до 15 десятичных разрядов . d1 инициализируется с помощью 7 значащих цифр, а не 6, тогда как d2 имеет только 1 значащую цифру. Тот факт, что они существенно различаются по величине, тоже не помогает.

однако двоичный FP напрямую поддерживается оборудованием, поэтому он значительно быстрее, чем десятичные операции FP.

Обратите внимание, что double имеет точность примерно до 15 значащих цифр , а не до 15 десятичных разрядов . d1 инициализируется с помощью 7 значащих цифр, а не 6, тогда как d2 имеет только 1 значащую цифру. Тот факт, что они существенно различаются по величине, тоже не помогает.

6
ответ дан 18 December 2019 в 05:14
поделиться

Избегать сравнения на равенство для чисел с плавающей запятой.

2
ответ дан 18 December 2019 в 05:14
поделиться

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

В этом случае .1 decimal повторяется бесконечно, когда представлено в двоичном формате. Он преобразуется в .000110011001100110011 ... и повторяется бесконечно. Никакая точность не сохранит это точно.

3
ответ дан 18 December 2019 в 05:14
поделиться

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

3
ответ дан 18 December 2019 в 05:14
поделиться
Другие вопросы по тегам:

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