Есть ли способ преобразовать float как десятичное без округления и с сохранением его точности?

Стиль кодирования ядра Linux Глава 5 дает большие плюсы и минусы (в основном минусы) использования typedef.

Пожалуйста, не используйте такие вещи, как "vps_t".

Это ошибка - использовать typedef для структур и указателей. Когда вы видите

vps_t a;

в источнике, что это значит?

Напротив, если он говорит

struct virtual_container *a;

, вы можете сказать, что «а "есть.

Многие думают, что typedefs «помогают читабельности». Не так. Они полезны только для:

(a) полностью непрозрачных объектов (где typedef активно используется, чтобы скрыть , что это за объект).

Пример: «pte_t» и т. Д. Непрозрачные объекты, доступ к которым можно получить только с помощью соответствующих функций доступа.

ВНИМАНИЕ! Непрозрачность и «функции доступа» сами по себе не годятся. Причина, по которой мы их используем для таких вещей, как pte_t и т. Д., Заключается в том, что там действительно ноль портативно доступной информации.

(b) Ясные целочисленные типы, где абстракция помогает избежать путаницы, является ли она «int» или «long».

u8 / u16 / u32 - отличные определения типов, хотя они вписываются в категорию (d) лучше, чем здесь.

ВНИМАНИЕ! Опять же - для этого должна быть причина . Если что-то «unsigned long», то нет причин делать это

typedef unsigned long myflags_t;

, но если есть четкая причина, почему это при определенных обстоятельствах может быть «unsigned int», а в других конфигурациях может быть « unsigned long ", тогда непременно воспользуйтесь typedef.

(c) когда вы используете sparse для буквального создания нового типа для проверки типов.

(d) Новые типы, которые идентичны стандартным типам C99, при определенных исключительных обстоятельствах.

Хотя глазам и мозгу понадобится совсем немного времени, чтобы привыкнуть к стандартным типам, таким как «uint32_t», некоторые люди все равно возражают против их использования.

Поэтому разрешены специфичные для Linux типы 'u8 / u16 / u32 / u64' и их подписанные эквиваленты, которые идентичны стандартным типам, хотя они не являются обязательными в новом собственном коде.

При редактировании существующего кода, который уже использует тот или иной набор типов, вы должны соответствовать существующим вариантам в этом коде.

(e) Типы, безопасные для использования в пользовательском пространстве.

В некоторых структурах, видимых для пользовательского пространства, мы не можем требовать типов C99 и не можем использовать форму «u32» выше. Таким образом, мы используем __u32 и подобные типы во всех структурах, которые используются совместно с пользовательским пространством.

Может быть, есть и другие случаи, но правило должно заключаться в том, чтобы НИКОГДА не использовать typedef, если вы не можете четко соответствовать одному из этих правил.

В общем, указатель или структура, которая имеет элементы, к которым можно разумно обращаться напрямую, никогда не должна быть typedef.

26
задан Ɖiamond ǤeezeƦ 22 March 2019 в 13:30
поделиться

3 ответа

Вы пробовали:

SELECT Cast( 2.555 as decimal(53,8))

Это вернет 2.55500000. Это то, что вы хотите?

ОБНОВЛЕНИЕ:

Очевидно, вы также можете использовать SQL_VARIANT_PROPERTY, чтобы найти точность и масштаб значения. Пример:

SELECT SQL_VARIANT_PROPERTY(Cast( 2.555 as decimal(8,7)),'Precision'),
SQL_VARIANT_PROPERTY(Cast( 2.555 as decimal(8,7)),'Scale')

возвращает 8|7

Вы можете использовать это в процессе конвертации ...

51
ответ дан 28 November 2019 в 06:57
поделиться

Попробуйте SELECT CAST(field1 AS DECIMAL(10,2)) field1 и замените 10,2 с той точностью, которая вам нужна.

2
ответ дан 28 November 2019 в 06:57
поделиться
cast (field1 as decimal(53,8)
) field 1

По умолчанию: десятичное (18,0)

1
ответ дан 28 November 2019 в 06:57
поделиться
Другие вопросы по тегам:

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