Public double c что это
Перейти к содержимому

Public double c что это

  • автор:

Неточное значение у double [дубликат]

Потому что компьютер не может представить 0.1 + 0.2 = 0.3 внутри стандартного double в виду его архитектуры. У него есть ошибки точности, которые, если грубо, и позволяют запихнуть такие диапазоны в 32/64 бит.

17 июл 2015 в 8:13

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Дело в том, что double — это число 64 битов, и возможно точно определить только 2 64 разные числа. Поэтому, будут много чисел, без точной репрезентацией в double .

Более того, число 0.3 (и 0.1 и 0.2 ) нельзя писать в двойчной системой счисления, будет бесконечно.

Самое близкое double от 0.1 — это

0.100000000000000005551115123126 

Самое близкое double от 0.2 — это

0.200000000000000011102230246252 

И вместе получится

0.300000000000000016653345369378 

Самое близкое double от этого:

0.300000000000000044408920985006 

Потом System.out.println покажет 0.30000000000000004 .

Microsoft .NET

Ну, что ж приступим разбирать основные конструкции языка C#, и с чем их едят?

Сегодня разберем:

  • Типы данных
  • Концепции ввода/вывода

Типы данных.

Типы данных имеют особенное значение в С#, поскольку это строго типизированный язык. Это означает, что все операции подвергаются строгому контролю со стороны компилятора на соответствие типов, причем недопустимые операции не компилируются. Следовательно, строгий контроль типов позволяет исключить ошибки и повысить надежность программ. Для обеспечения контроля типов все переменные, выражения и значения должны принадлежать к определенному типу. Такого понятия, как «бестиповая» переменная, в данном языке программирования вообще не существует. Более того, тип значения определяет те операции, которые разрешается выполнять над ним. Операция, разрешенная для одного типа данных, может оказаться недопустимой для другого.

В С# имеются две общие категории встроенных типов данных: типы значений и ссылочные типы. Они отличаются по содержимому переменной. Концептуально разница между ними состоит в том, что тип значения (value type) хранит данные непосредственно (стек), в то время как ссылочный тип (reference type) хранит адрес на значение (куча).

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

Определяемые пользователем value-типы

  • Структуры
  • Перечисления
  • Константы

Структуры.

Объекты «живут» в управляемой куче. Структуры часто располагаются в стеке вычислений.

Пример объявления структуры [C#] class Program < struct Simple < public int Position; public bool Exists; public double LastValue; >; static void Main() < Simple s; s.Position = 1; s.Exists = false; s.LastValue = 5.5; > >

Перечисления.

Тип enum предназначен для создания перечислений. Каждое перечисление определяет группу именованных констант. Например:

Такое перечисление эквивалентно следующим строкам кода:

const int One = 0;

const int Two = 1;

const int Three = 2;

Таким образом, перечисление — это всего лишь компактное объявление сразу нескольких целочисленных констант. Применение перечислений делает программы нагляднее.

Пример использования enum [C#] using System; class Program < enum Importance < None, Trivial, Regular, Important, Critical >; static void Main() < // 1. Importance value = Importance.Critical; // 2. if (value == Importance.Trivial) < Console.WriteLine("Not true"); >else if (value == Importance.Critical) < Console.WriteLine("True"); >> > Результат True

Константы.

Константа — это переменная, значение которой не может быть изменено. Переменные — это более гибкий способ хранения данных.

Однако иногда вы хотите гарантировать сохранение значения определенной переменной.
Например, число pi. Как известно, значение этого числа никогда не изменяется. Следовательно, вы должны гарантировать, что переменная, хранящая это число, не изменит своего значения на протяжении всей работы программы.

Ваша программа будет лучше читаемой, если вы вместо записи:
у = х * 3.1415926535897932384626433832795
будете использовать переменную, которая хранит значение pi.

В таком случае используемой переменной должна быть константа:
const double pi = 3.1415926535897932384626433832795;
у = х * pi;

Пример использования const [C#] using System; class Program < const string _html = ".html"; static void Main() < // Это вызовет ошибку компиляции: // _html = ""; Console.WriteLine(_html); // Обращение к const'анте Console.WriteLine(Program._html); // Обращение к const'анте const string txt = ".txt"; // И это приведет к ошибке компиляции: // txt = ""; Console.WriteLine(txt); > > Результат .html .html .txt

Способы ввода/вывода

Операторы ввода

Для того чтобы получить данные, вводимые вручную (то есть с консоли), применяются команды

 = Console.ReadLine() Пример int x; double y; string s; s = Console.ReadLine(); x = Convert.ToInt32(s); y = Convert.ToDouble(Console.ReadLine());
Операторы вывода

Сделаю одно важное замечание: ожидая от человека ввода с клавиатуры, не нужно полагать, что он окажется ясновидящим и просто по мерцанию курсора на черном экране догадается, какого типа переменная нужна ожидающей программе. Старайтесь всегда придерживаться правила: «лысый» ввод недопустим! Перед тем как считывать что-либо с консоли, необходимо сообщить пользователю, что именно он должен ввести: смысл вводимой информации, тип данных, максимальное и минимальное допустимые значения и т.п.

Примером неплохого приглашения служит, скажем, такая строчка: Введите два вещественных числа (0.1<1000000) — длины катетов.

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

Средства, позволяющие организовать выдачу информации на экран, мы здесь и рассмотрим.

Для того чтобы вывести на экран какое-либо сообщение, воспользуйтесь процедурой Console.Write или Console.WriteLine

Первая из них, напечатав на экране все, о чем ее просили, оставит курсор в конце выведенной строки, а вторая переведет его в начало следующей строчки.

 Console.WriteLine(s);// переменная Console.WriteLine(55.3);// константа Console.WriteLine(y*3+7);// выражение Console.Write(z);// переменная Console.Write(-5.3);// константа Console.Write(i*3+7/j);// выражение 

Чтобы при выводе данных они не склеивались, нужно позаботиться о пробелах между выводимыми переменными, также можно выводить списком несколько переменных:

 Console.WriteLine("Это число А= далее B= и, наконец их сумма ", a, b, a + b);

Для форматирования числовых результатов можно использовать метод String.Format или метод Console.Write , вызывающий метод String.Format . Формат задается с помощью строк формата. Спецификация формата следующая: , где N указывает позицию элемента в списке выводимых переменных (нумерация начинается с нуля); M — задает ширину области, в которую будет помещено форматированное значение, если M отсутствует или отрицательно, значение будет выровнено влево, в противном случае — вправо; Axx — является необязательной строкой форматирующих кодов, которые используются для управления форматированием чисел, даты и времени, денежных знаков и т.д.

Можно ли кастить long/double во float? Или long в double C#?

введите сюда описание изображения

Получаю json по api преобразовываю в структуру, но там получается вложенные массивы и нужно это переконвертить в нужный мне класс. Но данные приходят иногда double иногда long. И не получается привести к общему типу пробывал и float и double. Сейчас оставил float так как в доке к API описано что должны быть float, но json парсер их определяет как double. Вот дока навсякий https://opensky-network.org/apidoc/rest.html. Вот скрин структурки, там выделил одно и тоже поле. Оно бывает double бывает long. Это класс, что бы он знал как конвертить json

public class AirData

Это метод где пытаюсь приводить типы как нужно

public List ConvertToAirData() < var temp = new List(); foreach (var notformatted in states) < var airData = new AirData(); airData.icao24 = (string) notformatted[0]; airData.callsign = (string) notformatted[1]; airData.origin_country = (string) notformatted[2]; airData.time_position = (long) notformatted[3]; airData.last_contact = (long) notformatted[4]; airData.longitude = (float) notformatted[5]; airData.latitude = (float) notformatted[6]; airData.baro_altitude = (float) notformatted[7]; airData.on_ground = (bool) notformatted[8]; airData.velocity = (float) notformatted[9]; airData.true_track = (float) notformatted[10]; airData.vertical_rate = (float) notformatted[11]; airData.sensors = notformatted[12]; airData.geo_altitude = (float) notformatted[13]; airData.squawk = (string) notformatted[14]; airData.spi = (bool) notformatted[15]; airData.position_source = (long) notformatted[16]; temp.Add(airData); >return temp; > 

Выдает постоянно ошибки о не правильном приведении типа. «Необработанное исключение: System.InvalidCastException: Заданное приведение является недопустимым. » Проблема вроде решилась, как писал в комментах. Вот код как получаю json может кому будет полезно.

public static void Main(string[] args) < WebRequest request = WebRequest.Create("https://opensky-network.org/api/states/all?lamin=51.421812&lomin=23.139124&lamax=55.961184&lomax=33.472494"); WebResponse response = request.GetResponse(); Answer answer; using (Stream stream = response.GetResponseStream()) < using (StreamReader reader = new StreamReader(stream)) < string fullJson = ""; string line = ""; while ((line = reader.ReadLine()) != null) < fullJson += line; >// Console.WriteLine(fullJson); try < var res = new List(); answer = JsonConvert.DeserializeObject(fullJson); res = answer.ConvertToAirData(); foreach (var VARIABLE in res) < Console.WriteLine(VARIABLE); >> catch (NullReferenceException e) < Console.WriteLine("Ничего нету"); throw; >> > response.Close(); Console.WriteLine("Запрос выполнен"); Console.Read(); > 

Урок №114. Спецификаторы доступа public и private

На этом уроке мы рассмотрим, что такое спецификаторы доступа в языке С++, какие они бывают и как их использовать.

Оглавление:

  1. Спецификаторы доступа
  2. Использование спецификаторов доступа
  3. Структуры vs. Классы
  4. Тест

Спецификаторы доступа

Рассмотрим следующую программу:

struct DateStruct // члены структуры являются открытыми по умолчанию
int day ; // открыто по умолчанию, доступ имеет любой объект
int month ; // открыто по умолчанию, доступ имеет любой объект
int year ; // открыто по умолчанию, доступ имеет любой объект
DateStruct date ;
date . day = 12 ;
date . month = 11 ;
date . year = 2018 ;

Здесь мы объявляем структуру DateStruct, а затем напрямую обращаемся к её членам для их инициализации. Это работает, так как все члены структуры являются открытыми по умолчанию. Открытые члены (или «public-члены») — это члены структуры или класса, к которым можно получить доступ извне этой же структуры или класса. В программе, приведенной выше, функция main() находится вне структуры, но она может напрямую обращаться к членам day , month и year , так как они являются открытыми.

С другой стороны, рассмотрим следующий почти идентичный класс:

class DateClass // члены класса являются закрытыми по умолчанию
int m_day ; // закрыто по умолчанию, доступ имеют только другие члены класса
int m_month ; // закрыто по умолчанию, доступ имеют только другие члены класса
int m_year ; // закрыто по умолчанию, доступ имеют только другие члены класса
DateClass date ;
date . m_day = 12 ; // ошибка
date . m_month = 11 ; // ошибка
date . m_year = 2018 ; // ошибка

Вам бы не удалось скомпилировать эту программу, так как все члены класса являются закрытыми по умолчанию. Закрытые члены (или «private-члены») — это члены класса, доступ к которым имеют только другие члены этого же класса. Поскольку функция main() не является членом DateClass, то она и не имеет доступа к закрытым членам объекта date .

Хотя члены класса являются закрытыми по умолчанию, мы можем сделать их открытыми, используя ключевое слово public:

class DateClass
public : // обратите внимание на ключевое слово public и двоеточие
int m_day ; // открыто, доступ имеет любой объект
int m_month ; // открыто, доступ имеет любой объект
int m_year ; // открыто, доступ имеет любой объект
DateClass date ;
date . m_day = 12 ; // ок, так как m_day имеет спецификатор доступа public
date . m_month = 11 ; // ок, так как m_month имеет спецификатор доступа public
date . m_year = 2018 ; // ок, так как m_year имеет спецификатор доступа public

Поскольку теперь члены класса DateClass являются открытыми, то к ним можно получить доступ напрямую из функции main().

Ключевое слово public вместе с двоеточием называется спецификатором доступа. Спецификатор доступа определяет, кто имеет доступ к членам этого спецификатора. Каждый из членов «приобретает» уровень доступа в соответствии со спецификатором доступа (или, если он не указан, в соответствии со спецификатором доступа по умолчанию).

В языке C++ есть 3 уровня доступа:

спецификатор public делает члены открытыми;

спецификатор private делает члены закрытыми;

спецификатор protected открывает доступ к членам только для дружественных и дочерних классов (детально об этом на соответствующем уроке).

Использование спецификаторов доступа

Классы могут использовать (и активно используют) сразу несколько спецификаторов доступа для установки уровней доступа для каждого из своих членов. Обычно переменные-члены являются закрытыми, а методы — открытыми. Почему именно так? Об этом мы поговорим на следующем уроке.

Правило: Устанавливайте спецификатор доступа private переменным-членам класса и спецификатор доступа public методам класса (если у вас нет веских оснований делать иначе).

Рассмотрим пример класса, который использует спецификаторы доступа private и public:

class DateClass // члены класса являются закрытыми по умолчанию
int m_day ; // закрыто по умолчанию, доступ имеют только другие члены класса
int m_month ; // закрыто по умолчанию, доступ имеют только другие члены класса
int m_year ; // закрыто по умолчанию, доступ имеют только другие члены класса
void setDate ( int day , int month , int year ) // открыто, доступ имеет любой объект
// Метод setDate() имеет доступ к закрытым членам класса, так как сам является членом класса
m_day = day ;
m_month = month ;
m_year = year ;
void print ( ) // открыто, доступ имеет любой объект
std :: cout << m_day << "/" << m_month << "/" << m_year ; DateClass date ; date . setDate ( 12 , 11 , 2018 ) ; // ок, так как setDate() имеет спецификатор доступа public date . print ( ) ; // ок, так как print() имеет спецификатор доступа public

Результат выполнения программы:

Обратите внимание, хоть мы и не можем получить доступ к переменным-членам объекта date напрямую из main() (так как они являются private по умолчанию), мы можем получить доступ к ним через открытые методы setDate() и print()!

Открытые члены классов составляют открытый (или «public») интерфейс. Поскольку доступ к открытым членам класса может осуществляться извне класса, то открытый интерфейс и определяет, как программы, использующие класс, будут взаимодействовать с этим же классом.

Некоторые программисты предпочитают сначала перечислить private-члены, а затем уже public-члены. Они руководствуются следующей логикой: public-члены обычно используют private-члены (те же переменные-члены в методах класса), поэтому имеет смысл сначала определять private-члены, а затем уже public-члены. Другие же программисты считают, что сначала нужно указывать public-члены. Здесь уже иная логика: поскольку private-члены закрыты и получить к ним доступ напрямую нельзя, то и выносить их на первое место тоже не нужно. Работать будет и так, и так. Какой способ использовать — выбирайте сами, что вам удобнее.

Рассмотрим следующую программу:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *