Ноги в метр конвертер в C # сломан? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь сделать простой преобразователь футов в метр, но это происходит:

using System;
using System.Windows;
using System.Windows.Controls;

namespace CoolConversion
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        decimal feet;
        decimal meter;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            feet = Convert.ToDecimal(Feet.Text);
            meter = feet / 3.281;
        }
    }
}

Это код, который у меня сейчас есть. Сначала feet & meter были int, но я не мог разделить int на 3.281. Я изменил их на десятичные, и теперь у меня есть эта ошибка:

Ошибка CS0019 Оператор '/' не может быть применен к операндам типа 'десятичные' и 'двойные'

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

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Проблема здесь в том, что компилятор думает, что ваша константа 3.281 имеет тип double. Если вы собираетесь использовать такой тип, как decimal, вам придется добавить суффикс m. Аналогично с типами float необходимо добавить суффикс f. За MSDN:

По умолчанию действительный числовой литерал справа от оператора присваивания обрабатывается как double.


float

Поэтому, чтобы инициализировать переменную float, используйте суффикс f или F, как в следующем примере:
float x = 3.5F;


double

Однако, если вы хотите, чтобы целое число рассматривалось как double, используйте суффикс d или D, например:
double x = 3D;


decimal

Если вы хотите, чтобы числовой вещественный литерал обрабатывался как decimal, используйте суффикс m или M, например:
decimal myMoney = 300.5m;


Мой совет

Вы должны действительно определить, какой тип вам действительно нужно использовать, прежде чем использовать его. В случае конвертации футов в метров я бы использовал double или float; double обычно имеет место, потому что это более точно.

private double feet = 0.0d;
private double meters = 0.0d;

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) {
    feet = Convert.ToDouble(Feet.Text);
    meters = feet / 3.281d;
}

Тип decimal обычно используется для хранения денежных значений, где double и float используются для таких вычислений, как этот. Кроме того, это не является обязательным требованием, но если вы когда-либо работаете с несколькими похожими типами, например, float, double, decimal; всегда полезно использовать суффикс для каждого, чтобы четко передать, какой тип вы собираетесь использовать.


Финальная нота

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

С другой стороны, вы должны убедиться, что текст, который вы пытаетесь преобразовать, является допустимым значением, прежде чем пытаться преобразовать его. Я предпочитаю использовать TryParse (все числовые типы должны иметь метод TryParse, если я правильно помню). Причина этого заключается в том, что если я введу 123a в ваше текстовое поле в соответствии с тем, как работает ваш метод, он тут же взорвется. Исправить это очень просто:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) {
    if (double.TryParse(Feet.Text, out feet))
        meters = feet / 3.281d;
    else
        MessageBox.Show($"You've entered an invalid value: {Feet.Text}.");
}
0 голосов
/ 16 января 2019

По умолчанию 3.281 само по себе является двойным числом с плавающей запятой. Вы можете использовать буквенное обозначение decimal, добавив m в конец числа.

meter = feet / 3.281m;

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

double feetToMeterValue = 3.281;
meter = feet / (decimal)feetToMeterValue;

Это работает и для других типов, но просто имейте в виду, что вы потеряете точность при приведении к определенным типам, т.е. double> float и более очевидным decimal к int.

...